簡體   English   中英

初始化成員變量

[英]Initializing member variables

我已經開始采用這種模式了:

template<typename T>
struct DefaultInitialize
{
   DefaultInitialize():m_value(T()){}
   // ... conversions, assignments, etc ....
};

因此,當我有原始成員的類時,我可以將它們設置為在構造時初始化為0:

struct Class
{
  ...
  DefaultInitialize<double> m_double;
  ...
};

我這樣做的原因是為了避免必須記住在每個構造函數中初始化成員(如果有多個構造函數)。 我想弄清楚是否:

  • 這是一個有效的模式?
  • 我使用正確的術語?

這是一個有效的模式?

我想說,這是一種已知的“有效”模式。 Boost有一個名為value_initialized的類模板,它也可以完成。

我使用正確的術語?

那么,您的模板可以進行優化,以減少對類型參數的要求。 截至目前,您的類型T需要一個復制構造函數,不幸的是。 讓我們將初始化器更改為以下內容

DefaultInitialize():m_value(){}

然后,從技術上講,這種初始化稱為value initialization ,從C ++ 03開始。 這有點奇怪,因為首先沒有提供任何價值。 好吧,這種初始化看起來像默認初始化,但是用於填充零,但是尊重任何用戶定義的構造函數並執行它。

總而言之,您所做的是將值初始化為具有類型T的對象,然后將該對象復制到m_value 我上面的版本是什么值來直接初始化成員。

似乎需要做很多工作才能避免輸入m_double(0) 我認為乍一看更難理解,但只要一切都得到妥善實施,它看起來確實很好。

但是這值得嗎? 你到底想要#include "DefaultInitialize.h"嗎?


為了澄清,基本上,你是:

  • 由於包含,使您的編譯時間更長。
  • 您的代碼庫更大,因為您必須管理看似簡單的DefaultInitialize
  • 增加其他人閱讀代碼所需的時間。 如果你有一個類的成員是double ,這對我來說很自然,但是當我看到DefaultInitialize ,我必須知道它是什么以及它為什么被創建

所有這一切,因為你不喜歡鍵入構造函數。 我知道不必這樣做似乎很好,但是我寫過的最值得學習的課程往往需要編寫一個構造函數。

這當然只是我的意見,但我認為其他大多數人都會同意。 那就是:不必將成員顯式初始化為0會很方便,但替代方案(你的類)不值得。

更不用說在C ++ 0x中,你可以做到這一點;

class Foo
{
private:
    int i = 0; // will be initialized to 0
}

有些編譯器沒有正確實現值初始化 例如,請參閱Pavel Kuznetsov報告的Microsoft Connect, new-expression中的值初始化

Fernando Cacciola的boost :: value_initialized (這里已經提到過litb )為這樣的編譯器錯誤提供了一種解決方法。

如果您只是將基本類型初始化為零,則可以覆蓋new並將其memset分配的內存設置為零。 可能更簡單。 這樣做有利有弊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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