簡體   English   中英

C++ 在構造函數中將 0 分配給類變量時會發生什么

[英]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分配給pDatareference時究竟會發生什么?

此外,這里省略“默認參數”是否有原因? 像這樣的東西:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM