[英]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.