日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

清华大学C++课程学习笔记——第五章 数据共享与共享数据的保护

發布時間:2023/12/18 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 清华大学C++课程学习笔记——第五章 数据共享与共享数据的保护 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(一)數據的特點

1.作用域:

作用域名稱(由小到大)作用域范圍
函數原型作用域函數原型中的參數,作用域開始于“(”,結束于“)”
局部作用域函數的形參,在塊中聲明的標識符{}
類作用域范圍包括類體和成員函數體
文件作用域不在各個作用域出現的聲明就具有文件作用域,開始于聲明點,結束于文件尾

2.可見性

從引用的角度來談的概念,標識符在某處見,就可以在該處引用此標識符;
如果某個標識符在外層中聲明, 且在內層中沒有同一標識符聲明,則該標識符在內層可見;
對于兩個嵌套的作用域,內層聲明了與外層作用域同名的標識符,則外層作用域的標識符在內層不可見。
【總結:內層作用域的優先級更高】

# include<iostream>using namespace std;int i; //全局變量,文件作用域int main(){i = 5;{int i;i = 7;//局部變量,局部作用域cout<<"i="<<i<<endl; }cout<<"i="<<i<<endl;return 0;} 結果輸出 i=7 i=5

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,程序的小問題在沒有點數的時候

#include <iostream> using namespace std; class Point //Point類定義 { public: //外部接口Point(int xx=0, int yy=0) {X=xx; Y=yy; countP++; } //構造函數Point(Point &p); //拷貝構造函數~Point(){ countP--; }int GetX() {return X;}int GetY() {return Y;}void GetC() {cout<<" Object id="<<countP<<endl;} //輸出靜態數據成員 private: //私有數據成員int X,Y;static int countP; //靜態數據成員引用性說明,用于記錄點的個數 }; Point::Point(Point &p) {X=p.X;Y=p.Y;countP++; //在構造函數中對countP累加,所有對象共同維護同一個countP }int Point::countP=0; //靜態數據成員定義性說明和初始化,使用類名限定 int main() //主函數 {Point A(4,5); //定義對象A,其構造函數回使countP增1cout<<"Point A,"<<A.GetX()<<","<<A.GetY();A.GetC(); //輸出對象個數Point B(A); //定義對象B,其構造函數回使countP增1cout<<"Point B,"<<B.GetX()<<","<<B.GetY();B.GetC(); //輸出對象個數return 0; }

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++课程学习笔记——第五章 数据共享与共享数据的保护的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。