[英]What happens when assigning a string literal to a member const char* variable from within a constructor in C++?
[英]C++ what happens when 0 is assigned to class variable in constructor
我正在嘗試創建一個智能指針並偶然發現了下面的代碼。 由於我對 C++ 還很陌生,因此我還必須習慣它的語法。
下面您可以看到代碼中最重要的部分,其中RC
是引用計數器類,其成員變量稱為count
(類型為int
)。 函數addRef
以 1 遞增count
。
template < typename T > class SP
{
private:
T* pData; // pointer
RC* reference; // Reference count
public:
SP() : pData(0), reference(0)
{
reference = new RC();
reference->AddRef(); // Increment the reference count
}
//...
}
現在,當構造函數將0
分配給pData
和reference
時究竟會發生什么?
此外,這里省略“默認參數”是否有原因? 像這樣的東西:
SP() : pData(0), reference(new RC())
在構造函數代碼在構造函數序言中運行之前,它將被初始化為 0。 然后在構造函數中分配它時被覆蓋為另一個值。
你是對的 - 你可以在構造函數成員初始值設定項列表中執行 reference(new RC()) 。 最初的開發人員這樣做可能只是風格,或者他們可能希望有機會在那里放置斷點。 或者他們可以在不支持更復雜初始化程序的舊編譯器上工作。
設置為 0 並立即覆蓋它而不讀取該值很可能會被編譯器優化器拋出,因此這並不是真正的性能損失。
PS:這不是默認參數。 默認參數由調用者填寫,這由被調用者運行。
由於歷史原因, 0
等價於nullptr
,意思是“一個不指向任何東西的指針”。 在現代代碼中,您應該始終使用nullptr
,而不是0
。
這是要走的路還是有“更好的”最佳實踐?
拋開對正在執行的內容的擔憂,編寫與問題中提供的相同功能的最慣用的方法是:
nullptr
表示一個指針不指向任何東西。new
s 與delete
s 匹配,即使在示例代碼中也是如此。template < typename T > class SP
{
private:
T* pData = nullptr;
RC* reference = nullptr;
public:
SP() : reference(new RC())
{
reference->AddRef();
}
SP(const SP&) = delete;
SP& operator=(const SP&) = delete;
~SP() {
delete reference;
}
//...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.