下面是一些例子:
當你的類有兩個構造函數需要 初始化這個對象的數據成員在不同的順序可能發生這種情況。
class Example1 {
public:
Example1(std::string decoded, std::string encoded)
: decoded_(decoded),
encoded_(encoded) {}
explicit Example1(std::string encoded)
: decoded_(), // Can't use "decoded_(Decode())" since "encoded_" isn't initialised
encoded_(encoded) {
decoded_ = Decode(); // Assign here instead of initialising
}
private:
std::string Decode(); // decodes class member "encoded_"
std::string decoded_, encoded_;
};
在這個例子中,decoded_
總是會encoded_
之前,因爲這是它們被類中聲明的順序,即使我們換在初始化列表它們的順序初始化。
或者當一個數據成員需要對這個對象的引用,你 想避免編譯器警告有關使用此關鍵字之前 的{開頭的構造函數的身體(當你的特定編譯器碰巧發出那個特定的警告時)。
class Example2 {
public:
Example2() : functor_() {
functor_ = std::bind(&Example2::Do, this);
}
private:
void Do();
std::function<void()> functor_;
};
這裏,functor_
需要使用this
當它被初始化/分配。如果我們要在初始化列表中初始化functor_
,那麼this
指針將指向在那一點上未完全初始化的對象。這可能是安全的,具體情況取決於具體情況,但萬無一失的選項是推遲設置functor_
,直到構造函數體內部,此時this
確實引用完全初始化的對象。
或者當你需要在一個變量(參數, 全球等)使用該變量初始化 這個成員之一之前做的,如果/投擲試驗。
class Example3 {
public:
Example3(int force, int acceleration)
: force_(force),
acceleration_(acceleration),
mass_(0) {
if (acceleration_ == 0)
throw std::exception("Can't divide by 0");
mass_ = force_/acceleration_;
}
private:
int force_, acceleration_, mass_;
};
希望這是不言自明的。
我不知道什麼是
當兩個數據成員的自我指涉
,所以我不能給爲我怕一個例子的意思。
需要注意的一件事是,初始化順序不是可選的,無論按照哪個順序編寫初始化語句,它都是相同的 – 2012-04-25 21:06:29
您列出了自己的問題的答案,似乎是要求提供樣本?爲什麼?你不瞭解什麼部分? – 2012-04-25 21:08:04
你能否編輯你的問題來添加該語句的作者?換句話說,你是從哪裏來的? – nbro 2016-09-22 20:33:17