什麼是類的宣告與定義?
一、變數的宣告與定義很容易區分。
宣告只是告訴編譯器有這麼乙個變數,但是沒有為它分配空間;定義則是為該變數分配空間。所以變數可以重複宣告,但是不能重複定義。
那麼,類的宣告與定義又是什麼呢?
之前以為類的宣告就是為類開闢一塊空間;類的定義就是定義乙個物件,也就是為物件分配空間。
實際上,以上理解錯誤。
二、類的宣告與定義跟變數一樣。
1. 類的宣告就是告訴編譯器有這麼乙個類,它的名字是***,它具有哪些成員函式,哪些成員變數。注意,這裡只是宣告類,所以不僅沒有為成員變數分配空間,也沒有為成員函式分配空間。
2. 通過物件呼叫成員函式,在鏈結的時候才知道入口位址。當包含類的標頭檔案,然後建立類的物件,通過物件引用類的成員函式,這個時候其實並不知道成員函式的入口位址是什麼。只有當鏈結的時候,才知道入口位址是什麼。所以經常出現編譯成功,但是鏈結失敗的現象。這個時候問題大部分都是,宣告了函式或者變數,但是沒有定義。
3. 類的static成員變數,在類的宣告處並沒有定義。必須在類定義的地方,定義類的static成員變數,否則會出現鏈結錯誤。
如下**
[cpp]view plain
copy
print?
//file: case.h
class
case
; #include "case.h"
intcase::i2;
//注釋這句,出現鏈結錯誤。i2直到這裡才定義。
intcase::f1()
intcase::f2()
在c++類中宣告成員時可以加上static
關鍵字,這樣宣告的成員就叫做靜態成員(包括
資料成員和成員函式)。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classtest
~test(){}
public
:
//靜態成員函式
staticintgetcount()
private
:
//靜態資料成員
staticintm_ncount;
};
inttest::m_ncount=0;
靜態資料成員和普通資料成員區別較大,體現在下面幾點:
(1)普通
資料成員屬於類的乙個具體的物件,只有物件被建立了,普通資料成員才會被分配記憶體。而靜態資料成員屬於整個類,即使沒有任何物件建立,類的靜態資料
成員變數也存在。
(2)因為類的靜態資料成員的存在不依賴與於任何類物件的存在,類的靜態資料成員應該在**中被顯示的初始化,一定要在類外進行,例如上例。
(3)外部訪問類的靜態成員只能通過類名來訪問,例如:test::getcount()。
(4)類的靜態成員函式無法直接訪問普通
資料成員(可以通過物件名間接的訪問),而類的任何成員函式都可以訪問類的靜態資料成員。
(5)靜態成員和類的普通成員一樣,也具有public、protected、private3種訪問級別,也可以具有返回值、const
修飾符等引數。
應用舉例:
汽車製造商為統計汽車的產量,可以在在汽車類--car類中增加用於計數的靜態資料成員變數,比如在某個類car中宣告乙個static int number;初始化為0。這個number就能被所有car的例項共用。在car類的
建構函式裡加上number++,在car類的
析構函式裡加上number--。那麼每生成乙個car的例項,number就加一,每銷毀乙個car的例項(汽車報廢),number就減一,這樣,number就可以記錄在市場上car的例項個數。
類的宣告與定義
可以宣告乙個類而不定義它。class screen 宣告而未定義 在宣告之後 定義之前,類screen是乙個不完全型別,即已知screen是乙個型別,但不知道包含哪些成員。不完全型別只能以有限的方式使用。不能用來定義該型別的物件,只能用於定義指向該型別的指標及引用,或用於宣告 不能是定義 使用該型別...
模板類的宣告與定義
newhandlersupport.h 檔案 template class newhandlersupport template new handler newhandlersupport currenthandler template newhandlersupport newhandlersup...
類定義與前置宣告
本文要寫的是近期做專案過程中遇到的乙個語法方面的小問題,下文從問題描述,解決思路以及總結這樣的三段式描述來記錄一下,以為備忘。問題描述很簡單。在實現乙個模組的過程中,在標頭檔案x.h中定義了class b,class b繼承自class a class a定義在y.h中 為了避免兩個標頭檔案之間不同...