C 11 FAQ中文版 類成員的內部初始化

2021-07-25 04:31:33 字數 1970 閱讀 5999

三1

year 2011

陳 良喬

c++11 faq

類內部成員的初始化

在c++98標準裡,只有static const宣告的整型成員能在類內部初始化,並且初始化值必須是常量表示式。這些限制確保了初始化操作可以在編譯時期進行。例如:

int var = 7;

class x ;

c++11的基本思想是,允許非靜態(non-static)資料成員在其宣告處(在其所屬類內部)進行初始化。這樣,在執行過程中,需要初始值時建構函式可以使用這個初始值。考慮下面的**:

class a ;
這等同於:

class a 

};

從**來看,這樣可以省去一些文字的輸入,但是真正受益的是擁有多個建構函式的類。在大多數情況下,所有的建構函式都會使用成員變數的常見初始值:

class a 

a(int a_val) :

a(a_val), b(5), hash_algorithm(「md5″),

s(「constructor run」)

{}a(d d) : a(7), b(g(d)),

hash_algorithm(「md5″), s(「constructor run」)

{}int a, b;

private:

// 雜湊加密函式可應用於類a的所有例項

hashingfunction hash_algorithm;

std::string s; // 指示的字串變數將持續整個物件的生命週期

};

hash_algorithm和s每個都有乙個單獨的預設值的事實會由於雜亂的**而不明顯,這會在程式維護時造成麻煩。作為替代,可以將資料成員的初始值提取出來:

class a 

a(int a_val) : a(a_val), b(5) {}

a(d d) : a(7), b(g(d)) {}

int a, b;

private:

//雜湊加密函式可應用於類a的所有例項

hashingfunction hash_algorithm;

//指示的字串變數將持續整個物件的生命週期

std::string s;

};

如果乙個成員同時在類內部初始化時和建構函式內被初始化,則只有建構函式的初始化有效(這個初始化值「優先於」預設值)(譯註:可以認為,類內部初始化先於建構函式初始化進行,如果是對同乙個變數進行初始化,建構函式初始化會覆蓋類內部初始化)。因此,我們可以進一步簡化:

class a 

a(int a_val) : a(a_val) {}

a(d d) : b(g(d)) {}

int a = 7;

int b = 5;

private:

//雜湊加密函式可應用於類a的所有例項

hashingfunction hash_algorithm;

//指示的字串變數將持續整個物件的生命週期

std::string s;

};

或參見:

自己試試:

x.hclass x

;main.cpp

#include "x.h"

int main()

g++ -std=c++0x main.cpp

x.h:15:10: 對不起,尚未實現: non-static data member initializers

x.h:15:10: 錯誤: iso c++ 不允許在類內初始化非常量靜態成員『a』

x.h:16:10: 對不起,尚未實現: non-static data member initializers

x.h:16:10: 錯誤: iso c++ 不允許在類內初始化非常量靜態成員『b』

C 11 FAQ中文版 類成員的內部初始化

三1 year 2011 陳 良喬 c 11 faq 類內部成員的初始化 在c 98標準裡,只有static const宣告的整型成員能在類內部初始化,並且初始化值必須是常量表示式。這些限制確保了初始化操作可以在編譯時期進行。例如 int var 7 class x c 11的基本思想是,允許非靜態...

C 11 FAQ中文版 繼承的建構函式

三2 year 2011 陳 良喬 c 11 faq 繼承的建構函式 人們有時會對類成員函式或成員變數的作用域問題感到困惑,尤其是,當基類與派生類的同名成員不在同乙個作用域內時 struct b struct d b b b b.f 4.5 可行 呼叫的到底是b f doube 還是d f int ...

C 11 FAQ中文版 返回值型別後置語法

二28 year 2011 陳 良喬 c 11 faq 返回型別後置語法 考慮下面這段 template?mul t x,u y 函式mul 的返回型別要怎麼寫呢?當然,是 x y型別 但是這並不是乙個資料型別,我們如何才能一開始就得到它的真實資料型別呢?在初步了解c 0x之後,你可能一開始想到使用...