清华大学C++课程学习笔记——第五章 数据共享与共享数据的保护
(一)數(shù)據(jù)的特點
1.作用域:
| 函數(shù)原型作用域 | 函數(shù)原型中的參數(shù),作用域開始于“(”,結(jié)束于“)” |
| 局部作用域 | 函數(shù)的形參,在塊中聲明的標(biāo)識符{} |
| 類作用域 | 范圍包括類體和成員函數(shù)體 |
| 文件作用域 | 不在各個作用域出現(xiàn)的聲明就具有文件作用域,開始于聲明點,結(jié)束于文件尾 |
2.可見性
從引用的角度來談的概念,標(biāo)識符在某處見,就可以在該處引用此標(biāo)識符;
如果某個標(biāo)識符在外層中聲明, 且在內(nèi)層中沒有同一標(biāo)識符聲明,則該標(biāo)識符在內(nèi)層可見;
對于兩個嵌套的作用域,內(nèi)層聲明了與外層作用域同名的標(biāo)識符,則外層作用域的標(biāo)識符在內(nèi)層不可見。
【總結(jié):內(nèi)層作用域的優(yōu)先級更高】
3.生存期
| 靜態(tài)生存期 | 在文件作用域中聲明的對象;具有這種生存期、在函數(shù)內(nèi)部聲明靜態(tài)生存期對象,要冠以關(guān)鍵字static |
| 動態(tài)生存期 | 開始于程序執(zhí)行到聲明點時,結(jié)束于命名該標(biāo)識符的作用域技術(shù)處;塊作用域中聲明的,沒有贏static修飾的對象,動態(tài)生存期的對象eg.函數(shù)體里定義的變量 |
對比:靜態(tài)生存期的變量即使離開了作用域也仍然保存著
# include<iostream> using namespace std; int i = 1; //i為全局變量,具有靜態(tài)生存期void other(){static int a = 2;static int b = 3;//a,b為靜態(tài)全局變量,具有全局壽命,局部可見//只第一次進(jìn)入函數(shù)時被初始化int c = 10;//c為局部變量,具有動態(tài)生存期,每次進(jìn)入函數(shù)時都被初始化a+=2;i+=32;c+=5;cout<<"i=:"<<i<<endl;cout<<"a=:"<<a<<endl;cout<<"b=:"<<b<<endl;cout<<"c=:"<<c<<endl; }int main(){static int a; //靜態(tài)局部變量,全局壽命,局部可見int b = -10; //b,c為局部變量,具有動態(tài)生存期int c = 0;cout<<"---main---"<<endl;cout<<"i=:"<<i<<endl;cout<<"a=:"<<a<<endl;cout<<"b=:"<<b<<endl;cout<<"c=:"<<c<<endl;c+=8;i+=10;cout<<"---other---"<<endl;other();return 0; } 輸出結(jié)果 i=:1 a=:0 b=:-10 c=:0 ---other--- i=:43 a=:4 b=:3 c=:15變量和對象定義在不同位置
(作用域、可見性、生存期)
(二)數(shù)據(jù)共享
1.屬于整個類的數(shù)據(jù)成員——靜態(tài)數(shù)據(jù)成員
用關(guān)鍵字static聲明;為該類的所有對象共享,靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期;
必須在類外定義和初始化,用(::)來指明所屬的類。
eg:記錄點的個數(shù)count,程序的小問題在沒有點數(shù)的時候
2.靜態(tài)函數(shù)成員
背景:之前定義的成員函數(shù)是屬于對象的,靜態(tài)函數(shù)成員主要用于處理該類的靜態(tài)數(shù)據(jù)。
(調(diào)用非靜態(tài)函數(shù)時,隱含的傳遞了對象相關(guān)的信息,就是后面提到的this指針,第六章)
eg:把統(tǒng)計點的個數(shù)的函數(shù)加一個,解決上面例題無法輸出0個點的問題,沒有點就沒法調(diào)用
3.友元
(1)類的友元
將一個模塊聲明為另一個模塊的友元,一個模塊能夠引用到另一個模塊中被隱藏的信息;
破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制。
(2)友元函數(shù)
在類申明中用關(guān)鍵字friend修飾說明的非成員函數(shù),能夠通過對象名訪問private和protected成員;
eg:計算兩個點之間的距離,頻繁使用get相關(guān)函數(shù)
問題:給有元函數(shù)傳遞的引用,傳遞引用通用的問題是容易把值改變了
(3)友元類
一個類為另一個類的友元,則此類的所有成員函數(shù)都能訪問對方類的私有成員
聲明語法:將友元類名在另一個類中使用friend修飾說明,類的組合與部件
總結(jié):類的友元關(guān)系是單向的
#include <iostream> #include <cmath> using namespace std; class Point //Point類定義 { public: //外部接口Point(int xx=0, int yy=0) {X=xx;Y=yy;}int GetX() {return X;}int GetY() {return Y;}friend float fDist(Point &a, Point &b); //友元函數(shù)聲明,不是成員函數(shù),所以應(yīng)該把兩個點都作為參數(shù)傳遞 private: //私有數(shù)據(jù)成員int X,Y; }; float fDist(Point &p1, Point &p2) //友元函數(shù)實現(xiàn) { double x=double(p1.X-p2.X); //通過對象訪問私有數(shù)據(jù)成員double y=double(p1.Y-p2.Y);return float(sqrt(x*x+y*y)); } void main() //主函數(shù) {Point myp1(1,1),myp2(4,5); //定義Point類的對象cout<<"The distance is:";cout<<fDist(myp1,myp2)<<endl; //計算兩點間的距離 }(三)共享數(shù)據(jù)的保護
1.常類型
const:一個承諾,對于不改變對象的函數(shù),主動聲明為常函數(shù)
| 常對象 | const 類名 對象名 | 必須進(jìn)行初始化,且不能被更新 |
| 常成員 | 類型說明符 函數(shù)名(參數(shù)表)const | 常數(shù)據(jù)成員和常函數(shù)成員通過常對象只能調(diào)用它的成員函數(shù);const可用于參與對重載函數(shù)的區(qū)分;只能在初始化階段進(jìn)行賦值 |
| 常引用 | const 類型說明符 &引用名 | 被引用的對象不能被更新,eg友元函數(shù)中使用常引用作為參數(shù),或得較高的執(zhí)行效率,保證實參的安全性 |
| 常數(shù)組 | 類型說明符 const 數(shù)組名[大小] | 數(shù)組元素不能被更新 |
| 常指針 | 指向常量的指針 |
【牛客網(wǎng)經(jīng)常刷到:下面const語句正確的是】
(四)多文件結(jié)構(gòu)
1.組織結(jié)構(gòu)
- 類聲明文件(.h文件)
- 類實現(xiàn)文件(.cpp文件)
- 類使用文件(main()所在的.cpp文件)
利用工程文件來組合各個文件,系統(tǒng)中自帶的頭文件不帶.h用"<>"在安裝的默認(rèn)目錄下尋找
eg: # include "Point.h"
2.文件組織結(jié)構(gòu)對應(yīng)變量和函數(shù)的新操作
(1)外部變量
背景:由上面的文件組織結(jié)構(gòu)可知,有些變量可以在多個文件中使用;文件作用域中的變量默認(rèn)都是外部變量。
使用:extern關(guān)鍵字
(2)外部函數(shù)
背景:所有類之外的函數(shù)(非成員函數(shù))都是具有文件作用域的
使用:這樣的的函數(shù)可以在不同的編譯單元中被調(diào)用,在調(diào)用前進(jìn)行引用性聲明(聲明函數(shù)原型)
(3)匿名空間
變量和函數(shù)進(jìn)行空間限制
3.標(biāo)準(zhǔn)C++庫
主要分類:輸入/輸出類;容器類與抽象數(shù)據(jù)類型(大批量數(shù)據(jù),類模板的總稱);存儲管理類;算法;錯誤處理;運行環(huán)境支撐
4.編譯預(yù)處理命令
#include 包含指令
- 將一個源文件嵌入到當(dāng)前源文件中該點處
- # include<>按照標(biāo)準(zhǔn)方式搜索,文件位于C++系統(tǒng)目錄的include子目錄下
- # include""首先在當(dāng)前目錄下搜索,再按標(biāo)準(zhǔn)目錄搜索
#define 和 #undef
#if和#endif 和#else
總結(jié)
以上是生活随笔為你收集整理的清华大学C++课程学习笔记——第五章 数据共享与共享数据的保护的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第3章 词性标注(pos、N-gram、
- 下一篇: T410i开机显示fan error修复