C++基礎之 成員變量初 始化賦值


摘要: C++成員變量 初始化賦值 你都清楚嗎?還有好多坑,好多細節也不知道。。。

    今天在寫一個類的時候,由於該類的一個成員變量是引用,所以初始化出現了問題,查了一下之后,才發現,原來引用的初始化和const常量 一樣只能在構造函數的初始化列表里初始。突然發現自己的C++基礎本科的時候學的有待重溫。

    至於為什么成員變量中要用到引用,這個主要是該成員變量是另一個類的對象,但是該類卻禁止copy【怎么禁止拷貝構造函數?其實很簡單,聲明為Private即可】。

 

注解:

在 C++ 標准中(除了C++11版本以后), 類的成員變量的初始化都是在構造函數中實現的,不能在類中設定默認值。其中,有三類成員變量比較特殊,就是靜態類型成員變量,const常量類型成員變量, 引用類型成員變量。

1.引用的初始化const常量 一樣只能在構造函數初始化列表里初始。

2.靜態類型 成員變量 只能在類體外定義 及 初始化

 

#include <iostream>
#include <string>
using namespace std;

class TestVar{
public:
    TestVar():b(2), e(a)
    {
        a = 1;
        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
    }
//private:
public:
    //int a = 0;//error: ISO C++ forbids initialization of member ‘a’
    int a;//初始化可以在構造函數里面,也可以在初始化列表
    //const int b = 0;//error: ISO C++ forbids initialization of member ‘a’
    const int b;//常量的正確初始化應該使用[構造函數的初始化列表]
    int &e;//引用類型變量,和常量一樣只能在[構造函數的初始化列表],參數是同類型變量
    
    //static int c = 0;//ISO C++ forbids in-class initialization of non-const static member ‘c’
    static int c;
    static const int d = 4;//注意只有整型數據才行[int.., char]
    static const char f = 'a';//可以,char也是整型數據
    static const double h = 9.9;//書上說不行,但是在g++下是可以的,根編譯器有關吧
};
int TestVar::c = 3;//靜態成員的正確初始化方法

int main()
{
    TestVar t;
    t.a++;
    cout<<t.a<<"    "<<t.e<<endl;
    return 0;
}

運行結果:

 

修改構造函數為:

public:
    TestVar():b(2), e(a)
    {
        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
        a = 1;
    }

運行結果:

有上面對比發現, 構造函數的初始化列表是在 構造函數體 運行開始之前 最早運行的

此時, b 被賦值為2,  a變量沒有被初始化為隨機值 4197184 ,  e為a 的引用 所以 e值也為 4197184 。

 

 

 

 

 

 

 

源地址:

https://my.oschina.net/chengshuguang/blog/210666


免責聲明!

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



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