C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別
剛開始學(xué)習(xí)C++的類和對(duì)象的部分,對(duì)類中的常數(shù)據(jù)成員和靜態(tài)數(shù)據(jù)成員的概念和用法經(jīng)?;煜?,所以今天整理一下,順便說一下,今天是我的生日,祝我生日快樂,呵呵。
常數(shù)據(jù)成員
常數(shù)據(jù)成員是指在類中定義的不能修改其值的一些數(shù)據(jù)成員,類似于我們以前學(xué)過的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改。
適用于類中定義一些初始化之后不希望被修改的變量。
定義方法:
const 類型名 變量名;
(1)類中的常數(shù)據(jù)成員只能通過構(gòu)造函數(shù)的參數(shù)初始化表進(jìn)行初始化。
(2)常數(shù)據(jù)成員是實(shí)例化對(duì)象的一部分,可以用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;
}
運(yùn)行結(jié)果:

靜態(tài)數(shù)據(jù)成員
其實(shí)常數(shù)據(jù)成員和靜態(tài)數(shù)據(jù)成員完全是兩碼事,只不過一開始學(xué)習(xí)的時(shí)候容易混淆罷了。通過上面的解釋,我們知道常數(shù)據(jù)成員類似常變量,是一種一經(jīng)賦值就不可以改變的變量。
它們最大的區(qū)別就是靜態(tài)數(shù)據(jù)成員是可以被修改的,而且可以被任何一個(gè)對(duì)象修改,修改后的值,可以被所有的對(duì)象共享。
靜態(tài)數(shù)據(jù)成員是屬于一個(gè)類的而不是某一個(gè)對(duì)象,它是為該類所定義的所有的對(duì)象所共有。該類所定義的對(duì)象都可以引用該靜態(tài)成員,并且值都是一樣的。
靜態(tài)數(shù)據(jù)成員的存儲(chǔ)空間不同于普通的數(shù)據(jù)成員,它不屬于類的任何一個(gè)對(duì)象,是獨(dú)立于對(duì)象存儲(chǔ)的,因此也不可以通過對(duì)象的this指針來訪問。
并且,靜態(tài)數(shù)據(jù)成員不可以用參數(shù)初始化表進(jìn)行初始化操作,原因很簡單,因?yàn)槌跏蓟硎窃诙x對(duì)象的時(shí)候進(jìn)行的利用了this指針進(jìn)行操作,所以不可以。
靜態(tài)數(shù)據(jù)成員的定義的方式:
static int num;
訪問方式:
可以通過類名直接訪問:
Test::s_num;
也可以通過對(duì)象名訪問:
one.s_num;
不過為了區(qū)別于其他的成員變量,一般使用類名進(jìn)行訪問,因?yàn)殪o態(tài)數(shù)據(jù)成員不屬于對(duì)象,以免使人誤解。
#include<iostream>
using namespace std;
class Test
{
public:
Test(int n):c_num(n){};//只能用初始化表對(duì)常數(shù)據(jù)成員賦初值
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;//在類體為對(duì)靜態(tài)數(shù)據(jù)成員賦初值
int main()
{
Test one(10);
one.show();
one.change(10000);//改變靜態(tài)數(shù)據(jù)成員的值
cout<<"one changeed:"<<one.s_num<<endl; //使用對(duì)象名one間接訪問靜態(tài)數(shù)據(jù)成員
cout<<"Test changeed:"<<Test::s_num<<endl;//使用類名直接訪問靜態(tài)數(shù)據(jù)成員
Test two(20);
cout<<"two changeed:"<<two.s_num<<endl; //使用對(duì)象名two間接訪問靜態(tài)數(shù)據(jù)成員
two.change(99);
cout<<"Test changeed:"<<Test::s_num<<endl;//使用類名直接訪問靜態(tài)數(shù)據(jù)成員
return 0;
}
運(yùn)行結(jié)果:
分析: 我們?cè)诔绦蛑锌梢允褂妙惷苯釉L問靜態(tài)數(shù)據(jù)成員變量,就直接說明了它不屬于任何一個(gè)對(duì)象的這個(gè)特點(diǎn)。 我們?cè)诙x對(duì)象two的時(shí)候只對(duì)c_num進(jìn)行了賦值,但是我們使用two.s_num進(jìn)行輸出的時(shí)候也是可以輸出的,這也說明了這個(gè)數(shù)據(jù)成員確實(shí)可以被所有的對(duì)象進(jìn)行引用,并且值都是相同的,因?yàn)樗旧砭筒粚儆谌魏我粋€(gè)對(duì)象。
- C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解
- 詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員
- C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解
- C++讀取WAV音頻文件的頭部數(shù)據(jù)的實(shí)現(xiàn)方法
- C/C++中輸入多組數(shù)據(jù)的方法
- C++數(shù)據(jù)精度問題的解決方案(對(duì)浮點(diǎn)數(shù)保存指定位小數(shù))
- C++數(shù)據(jù)結(jié)構(gòu)之文件壓縮(哈夫曼樹)實(shí)例詳解
- 關(guān)于C++靜態(tài)數(shù)據(jù)成員的實(shí)現(xiàn)講解
相關(guān)文章
C++時(shí)間戳轉(zhuǎn)換成日期時(shí)間的步驟和示例代碼
這篇文章主要介紹了C++時(shí)間戳轉(zhuǎn)換成日期時(shí)間的步驟和示例代碼,需要的朋友可以參考下2016-12-12static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解
以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的完整代碼
通訊錄是一個(gè)可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關(guān)于利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06C++語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04