類成員變量初始化


 

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

    1、類里面的任何成員變量在定義時是不能初始化的。
    2、一般的數據成員可以在構造函數中初始化。(構造初始化列表初始化和構造函數體內賦值初始化)
    3、const數據成員必須在構造函數的初始化列表中初始化。(道理很簡單,const成員第一次數據初始化就是發生在類構造數據初始化時,一旦過了此時就會出現問題)。
    4、static在類的定義外面初始化。  
    5、數組成員是不能在初始化列表里初始化的。
    6、不能給數組指定顯式的初始化。

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

const int aa[100];

如果可以,怎么初始化aa?  

實際上不行的,這與3 5 矛盾。我們可以用static數據成員來解決此問題。

對於1的疑問:

(1)定義類的時候並沒有分配內存,賦值的話值放在哪里呢?

當用類構造對象的時候首先分配內存然后調用構造函數,這時候才可以初始化非靜態成員變量.
靜態成員變量定義的時候在靜態存儲區中就分配了內存所以可以初始化

類的定義實際相當與類型聲明,並沒有分配存儲空間,初始化的數據哪里放? 類實例化以后才會有實體存儲地址及空間。

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

 

 

為什么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; 錯誤的初始化方法-2、成員變量在定義時不能初始化
    const    int var2 ;
    //const  int var22 =22222; 錯誤的初始化方法-3、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; //正確-4、static可在類的定義外面初始化

//int Test::var1 = 11111; 錯誤-只有靜態成員才能在類的外面初始化
Test::Test(void) :var1(11111),var2(22222)   //正確;但var3(33333) 不能在這里初始化
{
    var1 =11111;     //正確, 普通變量可以在這里初始化
    //var2 = 222222; 錯誤-3、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


免責聲明!

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



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