[英]Pointer Member Variable Initialization in C++ Classes
這聽起來很基礎,讓人覺得我自己找到答案的努力為零,但我發誓我確實搜索了大約 20 分鍾,但沒有找到答案。
如果私有 c++ class 成員變量(非靜態)是一個指針,並且未在構造函數中初始化(通過初始化列表或構造函數中的賦值),那么當 class 完全實例化時,它的值是多少?
獎勵問題:如果上述問題的答案不是 NULL,我希望總是將一個特定的成員指針變量初始化為 NULL,並且我有多個構造函數,我真的必須在每個構造函數中為該指針顯式初始化嗎我寫的構造函數? 如果是這樣,專業人士如何處理這個問題? 肯定沒有人真的在他們所有的構造函數中為同一個成員放置了冗余的初始值設定項,是嗎?
編輯:我希望我能在這里選擇兩個答案。 Bleep Bloop 推薦的智能指針似乎是最優雅的方法,並且獲得了最多的投票。 但是由於我實際上並沒有在我的工作中使用智能指針(還),所以我選擇了沒有使用智能指針的最具說明性的答案作為答案。
你的想法正確。 如果你沒有初始化它,它可能是任何東西。
所以你的問題的答案是,或者用某個東西初始化它,或者給它一個NULL(或者在最新的C ++標准中為nullptr)。
class A
{
};
class B
{
private:
A* a_;
public:
B() : a_(NULL) { };
B(a* a) : a_(a) { };
};
這里我們的默認ctor使它為NULL(如果需要,用nullptr
替換),第二個構造函數將使用傳遞的值初始化它(這也不保證是好的!)。
該值將是未初始化的,所以是的,您需要將其顯式初始化為nullptr
。
使用智能指針( std::unique_ptr
, std::shared_ptr
, boost::shared_ptr
等)意味着您不需要明確地執行此操作。
任何未初始化的指針的值總是垃圾,它是一些隨機的內存地址。
在構造函數中,您可以使用初始化列表來初始化指針
只是
MyClass::MyClass() : myPointer(nullptr)
{
}
嘗試引用未初始化的指針會觸發未定義的行為。 所以總是初始化你的指針。
價值將是不確定的。
你可能有一個“終極”ctor,它將初始化所有字段,並添加只有部分參數的“short-cut”ctors,這些參數將傳遞給最終ctor以及其余params的默認值。
即使投票最多的答案在技術上是正確的,我建議更好的方法是在類本身中初始化變量。
class A
{
};
class B
{
private:
A* a_ = nullptr;
public:
B() : { };
B(a* a) : a_(a) { };
};
在 C++ 中,允許使用initialization list
語法為成員變量初始化值。 看到這個:
class AnyClass
{
};
class Xyz
{
int n;
AnyClass *p;
Xyz() : n(55), p(new AnyClass())
{
// constructor body
}
~Xyz() { delete p; }
};
n
的值變為 55 並且指向新創建的 AnyClass 的指針被初始化為p
。 請注意,它們未分配給n
和p
。 它們被初始化為成員變量。
使用new
時,應使用delete
刪除它。使用new[]
時,應使用delete[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.