C++類中的常數據成員與靜態數據成員之間的差別。本站提示廣大學習愛好者:(C++類中的常數據成員與靜態數據成員之間的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是C++類中的常數據成員與靜態數據成員之間的差別正文
剛開端進修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停止輸入的時刻也是可以輸入的,這也解釋了這個數據成員確切可以被一切的對象停止援用,而且值都是雷同的,由於它自己就不屬於任何一個對象。