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