類成員變量初始化

 

C++類初始化需注意如下幾點

    一、類裏面的任何成員變量在定義時是不能初始化的。
    二、通常的數據成員能夠在構造函數中初始化。(構造初始化列表初始化和構造函數體內賦值初始化)
    三、const數據成員必須在構造函數的初始化列表中初始化。(道理很簡單,const成員第一次數據初始化就是發生在類構造數據初始化時,一旦過了此時就會出現問題)。
    四、static在類的定義外面初始化。  
    五、數組成員是不能在初始化列表裏初始化的。
    六、不能給數組指定顯式的初始化。html

    從上面的3和5能夠看出:C++裏面是不能定義常量數組的!但可定義靜態常量數組。ios

const int aa[100];數組

若是能夠,怎麼初始化aa?  異步

實際上不行的,這與3 5 矛盾。咱們能夠用static數據成員來解決此問題。ide

對於1的疑問:函數

(1)定義類的時候並無分配內存,賦值的話值放在哪裏呢?post

當用類構造對象的時候首先分配內存而後調用構造函數,這時候才能夠初始化非靜態成員變量.
靜態成員變量定義的時候在靜態存儲區中就分配了內存因此能夠初始化url

類的定義實際至關與類型聲明,並無分配存儲空間,初始化的數據哪裏放? 類實例化之後纔會有實體存儲地址及空間。spa

(2)類只是一個抽象類型,並非實體的東西,利用這個抽象類型會實例化成不一樣的個體,每一個個體的特徵(數據成員)都不同,若是在類定義中將特徵初始化了,豈不是破壞了抽象性,作了一個面向都同樣的模子?.net

 

 

爲何static數據成員必定要在類外初始化

  這是由於被static聲明的類靜態數據成員,其實體遠在main()函數開始以前就已經在全局數據段中誕生了(見《Inside   The   C++   Object   Model》page247)!其生命期和類對象是異步的,(並且靜態語意說明即便沒有類實體的存在,其靜態數據成員的實體也是存的)這個時候對象的生命期尚未開始,若是你要到類中去初始化類靜態數據成員,讓靜態數據成員的初始化依賴於類的實體,,那怎麼知足前述靜態語意呢?難道類永遠不被實例化,咱們就永遠不能訪問到被初始化的靜態數據成員嗎 

靜態成員變量隸屬於類,不是某個對象,因此靜態成員變量不可能佔用某一個對象的存儲空間,因此靜態成員須要再類外部定義,以便靜態成員變量在全局數據區分配其存儲空間。

 

 

#include <stdio.h>
class Test
{
private:
    static int cCount;
public:
    Test()
    {
        cCount++;
    }
    ~Test()
    {
        --cCount;
    }
    int getCount()
    {
        return cCount;
    }
};
int Test::cCount = 0;

 

  

 

 

 

static const int能夠在類裏面初始化,由於它既然是const,那程序就不會再去試圖初始化

 

C++類初始化示例

 

-----------------Test.h----------------------------
#pragma once

class Test
{
private :
    int   var1;
    //int var11= 4; 錯誤的初始化方法-二、成員變量在定義時不能初始化
    const    int var2 ;
    //const  int var22 =22222; 錯誤的初始化方法-三、const數據成員必須在構造函數的初始化列表中初始化
    static   int  var3;
    //static int var3333=33333; 錯誤-只有靜態常量成員才能直接賦值來初始化
    static const int var4=4444; //正確,靜態常量成員能夠直接初始化
    static const int var44;
public:
    Test(void);
    ~Test(void);
};
--------------------Test.cpp-----------------------------------

#include ".\test.h"

int Test::var3 = 3333333; //正確-四、static可在類的定義外面初始化

//int Test::var1 = 11111; 錯誤-只有靜態成員才能在類的外面初始化
Test::Test(void) :var1(11111),var2(22222)   //正確;但var3(33333) 不能在這裏初始化
{
    var1 =11111;     //正確, 普通變量能夠在這裏初始化
    //var2 = 222222; 錯誤-三、const數據成員必須在構造函數的初始化列表中初始化
           
    var3 =44444;   //這個是賦值,值會影響到其它實例
}

Test::~Test(void)
{
}

 

複製代碼
#include<iostream>
using namespace std;

class Test {
  int a;              // 初始化位置:構造函數初始化成員列表,構造函數,其餘函數
  const int b;        // 初始化位置:構造函數初始化成員列表
  int & c;            // 初始化位置:構造函數初始化成員列表
  static int d;       // 初始化位置:類文件
  static const int e; // 初始化位置:類文件
  static int &f;      // 初始化位置:類文件
public :  
  Test(int a,int b,int c):a(a),b(b),c(c) { }  // 構造函數初始化成員列表
};
int Test::d = 0;          // 類文件
const int Test::e = 0;    // 類文件
int& Test::f = Test::d;   // 類文件
int main() {
    Test test(1,2,3);
    system("PAUSE");
    return 0;
}

 

 

 

 

 

 

 

 

http://www.cnblogs.com/pangxiaodong/archive/2011/08/10/2133197.html

http://blog.csdn.net/yjkwf/article/details/6067267

http://www.sowsoy.com/topics-399.html

http://bbs.csdn.net/topics/120095841

http://blog.csdn.net/qqaiustc/article/details/38742435

http://www.cnblogs.com/dongsheng/p/3327498.html

相關文章
相關標籤/搜索