C++類中變量定義初始化總結


1、類成員不可以在定義時初始化

2、const類型的成員必須在初始化化列表進行初始化;一般變量在在初始化列表中初始化的順序決定於定義的順序

#include<iostream>
using namespace std;

class A
{
private:
    int n1;
    int n2;
    
public:

    A():n2(0),n1(n2+2){} 
    
    void Print(){
        cout << "n1:" << n1 << ", n2: " << n2 <<endl;  
    }
};

int main()
{

    A a;
    a.Print();

    getchar();
    return 1;
}
復制代碼

 

輸出以上結果的時候,以為是n1:2,n2:0嗎

 

錯了!

 

#include<iostream>
using namespace std;

class A
{
private:
    int n1;
    int n2;
    
public:

    //A():n2(0),n1(n2+2){} //n1:-858993458, n2: 0
    //A():n1(n2+2),n2(0){}    //n1:-858993458, n2: 0
    //A():n1(0),n2(n1+2){}//n1:0, n2: 2
    A():n2(n1+2),n1(0){}//n1:0, n2: 2

    void Print(){
        cout << "n1:" << n1 << ", n2: " << n2 <<endl;  
    }
};

int main()
{

    A a;
    a.Print();

    getchar();
    return 1;
}

  嘗試運行以上的例子,可以發現,在用T():name(),name2():{}的形式進行初始化的時候,初始化的順序是與類中本來類的變量位置的順序有關,與T():name(),name2():{}的形式中變量名的順序無關。

 

 

3、static類型的成員變量需要在類外進行初始化

原因: 在類中,只是聲明了靜態變量,並沒有定義。 2. 聲明只是表明了變量的數據類型和屬性,並不分配內存;定義則是需要分配內存的。 注意:如果在類里面這么寫int a; 那么是既聲明了變量,也定義了變量,兩者合在一起了。 3. 靜態成員是“類級別”的,也就是它和類的地位等同,而普通成員是“對象(實例)級別”的。類級別的成員,先於該類任何對象的存在而存在,它被該類所有的對象共享。 4. 現在,咱們假定要實例化該類的一個對象,那么會發生什么事情呢?靜態成員肯定要出現在這個對象里面的,對吧?這時候才去定義那個靜態成員嗎?這顯然是不合適的。因為,比如有另外一個線程也要創建該類的對象,那么也要按照這個方式去定義那個靜態成員。這會產生兩種可能的情況:1. 重復定義;2. 就算不產生重復定義的情況,也會產生競爭,從而造成死鎖的問題,以至於對象無法創建。很顯然,編譯器不能這么干。那么很合理的解決辦法,就是事先在類的外部把它定義好,然后再供所有的對象共享。 注意:類的靜態常量成員可以類內初始化

列子:

#include   <iostream.h> 

class   CDummy 

public: 
        static   int   n; //這里只是聲明
}; 

int   CDummy::n=9; //這里是定義加初始化

void   main() 

        cout < <CDummy::n < <endl; 


上面這樣完全沒問題,但是不能直接在類中初始化,比如: 

static   int   n=9; 




4、static的常量可以在類中進行初始化

class A

 
       

{

 
       

private:

 
       

      static const int a = 0;  //正確

 
       

      static const char b = 'b';  //正確

 
       

      const int c = 0; //錯誤,非static const不能在類里面初始化

 
       

      static const int d[10] = {0}; //錯誤,只有一般數據類型的static const才能在類里面初始化。

 
       

                                                   //數組應該在.cpp文件里面初始化

 
       

}



初始化順序總結為:
  • 1基類的靜態變量或全局變量
  • 2派生類的靜態變量或全局變量
  • 3基類的成員變量
  • 4派生類的成員變量



打賞

免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2022 CODEPRJ.COM