C++ 數(shù)據(jù)共享與保護(hù)
1.作用域
作用域:一個(gè)標(biāo)識(shí)符在程序正文中有效的區(qū)域。
函數(shù)原型(函數(shù)聲明)作用域
例如函數(shù)原型void Print(int a);
,變量a的作用域?yàn)槔ㄌ?hào)左右之間。
局部作用域
例如如下函數(shù)定義,變量a
的作用域?yàn)榇罄ㄌ?hào)之間。
void Print(){ int a = 0; std::cout << a << std::endl; }
類作用域
X
類的成員m
具有類作用域(設(shè)其一個(gè)實(shí)例對(duì)象為x),以下是在不同環(huán)境下對(duì)m的訪問方法:
1.類內(nèi)訪問:
直接通過(guò)標(biāo)識(shí)符m訪問。
2.類外訪問:
普通成員通過(guò)x.m
類成員通過(guò)
X::m
對(duì)象指針通過(guò)
ptr->m
命名空間作用域
在XX命名空間中聲明的對(duì)象m,其作用域在命名空間之內(nèi)。命名空間外想訪問該對(duì)象要以XX::m的方式進(jìn)行。
namespace XX{ // 命名空間中聲明 void Print(); } XX::Print(){ // 命名空間外定義 //Print函數(shù)的定義 } XX::Print() // 命名空間外使用
using
語(yǔ)句可以簡(jiǎn)化對(duì)命名空間內(nèi)對(duì)象的訪問:
- 1.使用
using XX::Print
;語(yǔ)句后,其后只需要通過(guò)Print就可以調(diào)用該函數(shù)對(duì)象。 - 2.使用
using namespace XX
;語(yǔ)句后,其后只需要通過(guò)函數(shù)名就可以調(diào)用XX命名空間下的對(duì)象。
2.可見性
可見性:程序運(yùn)行到某一點(diǎn),能夠引用到的標(biāo)識(shí)符,稱該標(biāo)識(shí)符為可見的。
可見性隱藏規(guī)則:在多個(gè)具有包含關(guān)系的作用域聲明的同名標(biāo)識(shí)符,外層標(biāo)識(shí)符在內(nèi)層不可見。
全局變量:可以被本程序所有對(duì)象或函數(shù)引用。
- 在默認(rèn)(全局)命名空間內(nèi)聲明的對(duì)象為全局變量,默認(rèn)本編譯單元內(nèi)可以引用。
- 通過(guò)關(guān)鍵詞
extern
聲明引用的全局變量為其他編譯單元中已經(jīng)定義的全局變量。 - 通過(guò)關(guān)鍵詞
static
聲明的全局變量只能在本編譯單元中使用,不能在其他編譯單元用extern
聲明引用。
局部變量:只能在內(nèi)部作用域內(nèi)被引用
3.對(duì)象的生存期
生存期:從對(duì)象內(nèi)存空間被分配到被釋放的期間。
靜態(tài)生存期:對(duì)象的生存期與程序的運(yùn)行期相同。
- 1.在命名空間內(nèi)聲明的對(duì)象都具有靜態(tài)生存期。
- 2.在局部作用域中用
static
關(guān)鍵詞聲明的對(duì)象具有靜態(tài)生存期,在對(duì)應(yīng)局部作用域中具有可見性。
動(dòng)態(tài)生存期:對(duì)象的生存期為聲明點(diǎn)到聲明點(diǎn)所在作用域的結(jié)束點(diǎn)之間。
4.類數(shù)據(jù)的共享
面向結(jié)構(gòu)編程:
程序模塊:函數(shù)
數(shù)據(jù)共享方式:參數(shù)傳遞、全局變量
面向?qū)ο缶幊蹋?/strong>
程序模塊:類
數(shù)據(jù)共享方式:類的靜態(tài)成員(類內(nèi)數(shù)據(jù)共享)、類的友元(類外數(shù)據(jù)共享)
類的靜態(tài)數(shù)據(jù)成員(類屬性):類變量由該類所有實(shí)例對(duì)象共享,用static修飾。
設(shè)X類的靜態(tài)成員為m,類的一個(gè)實(shí)例對(duì)象為x:
- 類的靜態(tài)變量必須類內(nèi)聲明,類外定義。
- 在類的第一個(gè)實(shí)例對(duì)象初始化前初始化,在內(nèi)存上只有一份副本。
- 類外定義時(shí)通過(guò)X::m進(jìn)行引用,定義后可以通過(guò)實(shí)例對(duì)象進(jìn)行引用,如x.m。
類的靜態(tài)函數(shù)成員(類方法):主要是處理類屬性或者處理該類下多個(gè)實(shí)例對(duì)象的方法,用static
修飾。
設(shè)X類的靜態(tài)函數(shù)為func,類的一個(gè)實(shí)例對(duì)象為x:
- 可以直接訪問該類的靜態(tài)數(shù)據(jù)和函數(shù)成員,不能訪問非靜態(tài)成員。
- 可以在類的第一個(gè)實(shí)例對(duì)象初始化前通過(guò)
X::func
進(jìn)行調(diào)用。 - 在實(shí)例對(duì)象初始化可以通過(guò)
x.func
調(diào)用,但是為了代碼的可讀性,不推薦這樣使用。
// 靜態(tài)成員案例 #include<iostream> using namespace std; class A { public: static int s_count; // 私有靜態(tài)數(shù)據(jù)成員聲明 static void set_count(int i) { // 靜態(tài)方法定義 s_count = i; } void UsingCount(){ s_count++; } }; int A::s_count = 0; // 私有靜態(tài)數(shù)據(jù)成員類外定義(注意要在前面加上數(shù)據(jù)的類型說(shuō)明符) int main() { A::s_count; // 通過(guò)類名調(diào)用 A::set_count(11); // 對(duì)象初始化前通過(guò)靜態(tài)函數(shù)成員訪問 A a1; a1.UsingCount(); // 通過(guò)普通函數(shù)成員修改靜態(tài)數(shù)據(jù)成員 cout << a1.s_count << endl; // 通過(guò)對(duì)象訪問靜態(tài)數(shù)據(jù)成員 A a2; a2.UsingCount(); cout << a2.s_count << endl; // 如果輸出結(jié)果是13,則證明靜態(tài)數(shù)據(jù)成員是共享的 }
輸出結(jié)果:
12
13
友元關(guān)系:一個(gè)類主動(dòng)聲明其他類或函數(shù)是他的友元,進(jìn)而給他們提供本類的訪問特許,用friend
修飾。
友元函數(shù):被一個(gè)類聲明為友元的函數(shù),在他的函數(shù)體內(nèi)可以通過(guò)對(duì)象名訪問類的私有和保護(hù)成員。
友元類:被一個(gè)類A聲明為友元的另一個(gè)類B,類B內(nèi)所有成員函數(shù)都是類A的友元函數(shù)。
//友元數(shù)據(jù)共享案例 #include<iostream> using namespace std; class A { private: int m_nums = 10; // 私有數(shù)據(jù)成員 friend class B; // 友元類聲明 }; class B { // 友元類 public: void Print(A& a) { // 友元函數(shù) cout << a.m_nums << endl; // 通過(guò)對(duì)象名訪問私有成員 } }; int main() { A a; B b; b.Print(a); // 訪問私有數(shù)據(jù)成員 }
結(jié)果輸出:
10
1
5.類共享數(shù)據(jù)的保護(hù)
常對(duì)象:常對(duì)象的數(shù)據(jù)成員值在對(duì)象整個(gè)生存期間不能被更改。
設(shè)A類的常對(duì)象為a
,常函數(shù)成員為func
,常數(shù)據(jù)成員為m
:
- 1. 聲明語(yǔ)法:
const A a
; - 2. 常對(duì)象必須進(jìn)行初始化,而且不能被更新(不能賦值或者調(diào)用普通成員函數(shù))。
- 3. 常對(duì)象只能調(diào)用常函數(shù)成員。
常函數(shù)成員:能被常對(duì)象調(diào)用訪問常數(shù)據(jù)成員。
- 1. 常函數(shù)成員聲明語(yǔ)法:返回值類型 func(參數(shù)表)const;
- 2. 常函數(shù)成員定義部分時(shí)要帶上
const
。 - 3. 常函數(shù)調(diào)用期間,因?yàn)槟繕?biāo)對(duì)象視為常對(duì)象,所以只能調(diào)用常函數(shù)。
- 4.
const
可以用于函數(shù)重載,通過(guò)非const
對(duì)象調(diào)用重載函數(shù)優(yōu)先調(diào)用非const的重載函數(shù)。
常數(shù)據(jù)成員:值在初始化后不能被更新。
- 1. 常數(shù)據(jù)成員聲明語(yǔ)法:
const
數(shù)據(jù)類型m
;。 - 2. 常數(shù)據(jù)成員不能被賦值,構(gòu)造函數(shù)只能通過(guò)初始化列表進(jìn)行初始化。
- 3. 靜態(tài)常數(shù)據(jù)成員在類外進(jìn)行定義。
//常成員案例 #include<iostream> using namespace std; class A { public: void Print()const { // 不修改對(duì)象數(shù)據(jù)成員值的函數(shù)應(yīng)該設(shè)為常函數(shù) cout << a << ',' << b << ',' << s << endl; } A(int i) :b(i) {}; // 初始化列表初始化 private: const int a = 1; // 已初始化的常數(shù)據(jù)成員 const int b; // 未初始化的常數(shù)據(jù)成員 const static int s; // 常靜態(tài)數(shù)據(jù)成員 }; const int A::s = 3; // 類外定義 int main() { A a(2); a.Print(); }
結(jié)果輸出:
1,2,3
1
常引用:常引用所引用的對(duì)象被視為常對(duì)象。
- 1. 常引用聲明語(yǔ)法:
const
數(shù)據(jù)類型 &引用名。 - 2.非
const
的引用只能綁定到普通對(duì)象。 - 3. 對(duì)于無(wú)需修改值的參數(shù)(復(fù)制構(gòu)造函數(shù)),盡量使用
const
進(jìn)行應(yīng)用
到此這篇關(guān)于C++ 數(shù)據(jù)共享與保護(hù)的文章就介紹到這了,更多相關(guān)C++ 數(shù)據(jù)共享與保護(hù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單實(shí)現(xiàn)C語(yǔ)言2048游戲
這篇文章主要為大家詳細(xì)介紹了簡(jiǎn)單實(shí)現(xiàn)C語(yǔ)言2048游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05VisualStudio2022 cmake配置opencv開發(fā)環(huán)境
本文主要介紹了VisualStudio2022 cmake配置opencv開發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08詳解C++如何實(shí)現(xiàn)在Word文檔中創(chuàng)建列表
這篇文章主要為大家詳細(xì)介紹了介紹如何使用C++在Word文檔中創(chuàng)建編號(hào)列表、項(xiàng)目符號(hào)列表和多級(jí)列表,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05c++內(nèi)聯(lián)函數(shù)(inline)使用詳解
這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下2014-04-04C語(yǔ)言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06解析c++ 中智能指針引用計(jì)數(shù)為什么不是0原理
這篇文章主要為大家介紹了C語(yǔ)言中智能指針引用計(jì)數(shù)為什么不是0原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08C++實(shí)現(xiàn)接兩個(gè)鏈表實(shí)例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)接兩個(gè)鏈表實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03