1. 程式人生 > >清華大學《C++語言程序設計基礎》線上課程筆記03---數據的共享和保護&數組

清華大學《C++語言程序設計基礎》線上課程筆記03---數據的共享和保護&數組

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---數據的共享和保護&數組