天天看點

關于C++中類的static和const成員

1. static成員變量

類的static成員變量,當在頭檔案中聲明後,應該再在類的源檔案中定義一下:

如在Test.h中有如下代碼:

#pragma once
class Test
{
private:
	static int data;
};
           

應該在Test.cpp中定義其成員變量data:

#include "Test.h"

int Test::data = 10;
           

注意定義data的代碼不應該寫在類的構造函數中,因為構造函數會被執行多次,同理也不應放在類的頭檔案中,因為頭檔案可能會被包含多次

2.static成員函數

類的static成員函數,是可以通過類名直接來調用的,這在很多情況下是比較友善的。但是類的static成員函數隻能通路類的static成員變量和static成員函數,因為其沒有this指針

3.const成員變量

類的const成員變量,隻能在構造函數的成員初始化清單中進行初始化,而且在之後不能被修改。可以把類的一些隻讀變量設定為const

Test.h檔案:

#pragma once
class Test
{
private:
	const int data;
};
           

Test.cpp檔案:

#include "Test.h"

Test::Test(void) :
data(10)
{
}
           

4.const成員函數

類的const成員函數,具有const this的指針,是以也就不能更改類中的成員變量。不過這個有個特例,就是當成員變量聲明為mutable時,它是可以被類的const成員函數更改的。

如果類的成員函數不對類的資料進行更改,則應該把此函數定義為const成員函數,首先它使類的接口更容易被了解,告訴調用者,這個函數不會對類的資料進行更改,其次,它可以擴大此函數的有效使用範圍:

例如在Test類中有一個列印類的基本資訊的函數,此函數對類的資料是隻讀的,如果沒有把它設定為const,則const Test的執行個體就不能調用此函數,這在邏輯上不太合理。是以應該把它設定為const的成員函數,這樣的話,Test的執行個體和const Test的執行個體都可以調用此函數了

5.static const成員變量

static const成員變量,在類的頭檔案中聲明後,也類似于static成員變量,應該在類的源檔案中再定義一下:

Test.h檔案:

#pragma once
class Test
{
private:
	static const int data;
};
           

應該在Test.cpp中定義其成員變量data:

#include "Test.h"

const int Test::data = 10;
           

不過,對于int型的static const成員變量,可以在聲明時直接定義它,如下:

#pragma once
class Test
{
private:
	static const int data = 10;
};
           

這樣在Test.cpp中就不必再定義data了。但這僅僅是對int型才行得通。如果在上面把int換成float或是其他的,編譯是通不過的。不知道為什麼這樣設計

繼續閱讀