剛開始學習C++的類和對象的部分,對類中的常數據成員和靜態數據成員的概念和用法經?;煜?,所以今天整理一下,順便說一下,今天是我的生日,祝我生日快樂,呵呵。
常數據成員
常數據成員是指在類中定義的不能修改其值的一些數據成員,類似于我們以前學過的常變量,雖然是變量,也有自己的地址,但是一經賦初值,便不能再被修改。
適用于類中定義一些初始化之后不希望被修改的變量。
定義方法:
const 類型名 變量名;
(1)類中的常數據成員只能通過構造函數的參數初始化表進行初始化。(2)常數據成員是實例化對象的一部分,可以用this指針訪問。
#include<iostream>
using namespace std;
class Happy_birthday
{
public:
Happy_birthday(char * na):name(na){}
void Print()
{
cout<<name<<" Happy Birthday!"<<endl;
}
private:
const char * name;
};
int main()
{
Happy_birthday qianshou("趙哲");
qianshou.Print();
return 0;
}
運行結果:
靜態數據成員
其實常數據成員和靜態數據成員完全是兩碼事,只不過一開始學習的時候容易混淆罷了。通過上面的解釋,我們知道常數據成員類似常變量,是一種一經賦值就不可以改變的變量。
它們最大的區別就是靜態數據成員是可以被修改的,而且可以被任何一個對象修改,修改后的值,可以被所有的對象共享。
靜態數據成員是屬于一個類的而不是某一個對象,它是為該類所定義的所有的對象所共有。該類所定義的對象都可以引用該靜態成員,并且值都是一樣的。
靜態數據成員的存儲空間不同于普通的數據成員,它不屬于類的任何一個對象,是獨立于對象存儲的,因此也不可以通過對象的this指針來訪問。
并且,靜態數據成員不可以用參數初始化表進行初始化操作,原因很簡單,因為初始化表是在定義對象的時候進行的利用了this指針進行操作,所以不可以。
靜態數據成員的定義的方式:
static int num;
訪問方式:可以通過類名直接訪問:
Test::s_num;
也可以通過對象名訪問:
one.s_num;
不過為了區別于其他的成員變量,一般使用類名進行訪問,因為靜態數據成員不屬于對象,以免使人誤解。
#include<iostream>
using namespace std;
class Test
{
public:
Test(int n):c_num(n){};//只能用初始化表對常數據成員賦初值
void show()
{
cout<<"c_num:"<<this->c_num<<endl;
cout<<"s_num:"<<s_num<<endl;
}
void change(int n)
{
s_num=n;
}
static int s_num;
private:
const int c_num;
};
int Test::s_num=100;//在類體為對靜態數據成員賦初值
int main()
{
Test one(10);
one.show();
one.change(10000);//改變靜態數據成員的值
cout<<"one changeed:"<<one.s_num<<endl; //使用對象名one間接訪問靜態數據成員
cout<<"Test changeed:"<<Test::s_num<<endl;//使用類名直接訪問靜態數據成員
Test two(20);
cout<<"two changeed:"<<two.s_num<<endl; //使用對象名two間接訪問靜態數據成員
two.change(99);
cout<<"Test changeed:"<<Test::s_num<<endl;//使用類名直接訪問靜態數據成員
return 0;
}
運行結果:
分析: 我們在程序中可以使用類名直接訪問靜態數據成員變量,就直接說明了它不屬于任何一個對象的這個特點。 我們在定義對象two的時候只對c_num進行了賦值,但是我們使用two.s_num進行輸出的時候也是可以輸出的,這也說明了這個數據成員確實可以被所有的對象進行引用,并且值都是相同的,因為它本身就不屬于任何一個對象。