三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之後,你可能一開始想到使用...