類的宣告與定義

2021-06-25 22:24:24 字數 2153 閱讀 8744

什麼是類的宣告與定義?

一、變數的宣告與定義很容易區分。

宣告只是告訴編譯器有這麼乙個變數,但是沒有為它分配空間;定義則是為該變數分配空間。所以變數可以重複宣告,但是不能重複定義。

那麼,類的宣告與定義又是什麼呢?

之前以為類的宣告就是為類開闢一塊空間;類的定義就是定義乙個物件,也就是為物件分配空間。

實際上,以上理解錯誤。

二、類的宣告與定義跟變數一樣。

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中 為了避免兩個標頭檔案之間不同...