清華大學《C++語言程序設計基礎》線上課程筆記03---數據的共享和保護&數組
阿新 • • 發佈:2018-10-20
main 成員函數 常量 大小 之前 pre 基於 一個 通過
數據的共享和保護
對象的生存期
static類型的局部變量,生存期在整個程序,局部可見。
void example()
{
static a=1;
int b=2
}
當調用完example函數後,b消亡,a仍然存在;
再次調用該函數時,a值不會再次被賦值,仍保持之前數據;而b需要重新建立,重新賦值。
類的靜態數據成員
1.用關鍵字static聲明;
2.為該類的所有對象共享,靜態數據成員具有靜態生存期;
3.必須在類外定義和初始化,用(::)來指明所屬的類.
這個數據屬於類的信息,比如統計教師群體中教師的總數,即這個類實例化了多少個對象。
class A{ static int num; //在類內聲明 } int A::num=0; //在類外定義和初始化
類的靜態函數成員
1.類外代碼可以使用類名和作用域操作符來調用靜態成員函數;
2.靜態成員函數主要用於處理該類的靜態數據成員,可以直接調用靜態成員函數;
3.如果訪問非靜態成員,要通過對象來訪問。
class A{ private: static int num; int a=1; public: static void shownum(){cout<< num << endl;} //2. static int change(int a);//一個定義的例子; } int A::num=0; int A::change(int a){ A::num=a; //靜態數據成員的引用需要加 “類::”來修飾 } int main(){ A:shownum(); // 1. }
類的友元
友元是C++提供的一種破壞數據封裝和數據隱藏的機制。
友元函數
在類聲明中由關鍵字friend修飾說明的非成員函數,在它的函數體中能
夠通過對象名訪問 private 和 protected成員
class Point { public: Point(int x=0, int y=0) : x(x), y(y) { } int getX() { return x; } int getY() { return y; } friend float dist(Point &a, Point &b); private: int x, y; }; float dist( Point& a, Point& b) //非成員函數 { double x = a.x - b.x; //通過對象名訪問私有成員 double y = a.y - b.y;return static_cast<float>(sqrt(x * x + y * y)); } int main(){ Point p1(1, 1), p2(4, 5); cout <<"The distance is: "; cout << dist(p1, p2) << endl; return 0; }
友元類
friend聲明是單向授權聲明,類A是類B的友元,意味著類A獲得了訪問類B的私有成員的權限,但類B不能反向訪問類A的私有成員;
此處的friend更像是一種"上級聲明"
class A {
friend class B;
public:
void display() {cout << x << endl;}
private:
int x;
};
class B {
public:
void set(int i);
void display();
private:
A a; //B類中含有A類成員,正常來說是看不到封裝的私有成員的
};
void B::set(int i) { a.x=i; } //因為是友元,所以可以通過對象名訪問私有成員
void B::display() { a.display(); }
共享數據的保護
- 對於既需要共享、又需要防止改變的數據應該聲明為常類型(用const進行修飾);
- 對於不改變對象狀態的成員函數應該聲明為常函數.
常類型
- 常對象:必須進行初始化,不能被更新
const 類名 對象名 const A a(1,2);
- 常成員: 用const進行修飾的類成員:常數據成員和常函數成員
- 常引用:被引用的對象不能被更新,既增加了效率又避免數據被篡改;常用作形參。
const 類型說明符 &引用名 const int &p;const A &p;
- 常數組:數組元素不能被更新(詳見第6章)。
類型說明符 const 數組名[大小]...
常指針:指向常量的指針(詳見第6章)。
數組
處理無明顯規律的大量同類型數據時,可以通過將其存入數組強制性添加一個次序信息,再結合循環語句,對其進行處理。
a[10]
數組名 a 是一個地址(指針)類型常量,對應數組首元素的內存地址,不能被賦值
數組名作函數參數
- 形、實參數都應是數組名(實質上是地址),類型要一樣,傳送的是數組首地址;
- 對形參數組的改變會直接影響到實參數組.
void rowSum(int a[][4], int nRow)
{
for (int i = 0; i < nRow; i++)
{
for(int j = 1; j < 4; j++)
a[i][0] += a[i][j];
}
}
int table[3][4] = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};
rowSum(table, 3);
對象數組
Point a[3];
實例化3個Point類的對象,調用3次構造和3次析構函數;
基於範圍的for循環
- 用來遍歷容器類十分方便
- c++11標準
double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};
for (double x : prices)
cout<<x<<std::endl;
清華大學《C++語言程序設計基礎》線上課程筆記03---數據的共享和保護&數組