C++ member initializer list

C++ member initializer list

member initializer list

根據Constructors and member initializer lists,member initializer的寫法為:

member initializer list, whose syntax is the colon character :, 
followed by the comma-separated list of one or more member-initializers, 
each of which has the following syntax

class-or-identifier ( expression-list(optional) )	(1)	
class-or-identifier brace-init-list	(2)	(since C++11)
parameter-pack ...	(3)	(since C++11)	

那麼在什麼時候我們會用到initializer list呢?

根據When do we use Initializer List in C++?,當一個成員變數是"參考成員變數"(reference members)時,我們必須使用initializer list,如在TensorRT/samples/common/logging.h中:

LogStreamConsumerBuffer(std::ostream& stream, const std::string& prefix, bool shouldLog)
    : mOutput(stream)
    , mPrefix(prefix)
    , mShouldLog(shouldLog)
{
}

mOutputstd::ostream&型別的變數,所以此處必須使用initializer list。

另外,如果一個成員變數沒有default constructor,我們同樣也得在initializer list裡對它進行初始化。

同樣在TensorRT/samples/common/logging.h中:

//注意這裡initializer list的寫法:我們可以在initializer list調用成員變數的constructor
LogStreamConsumerBase(std::ostream& stream, const std::string& prefix, bool shouldLog)
    : mBuffer(stream, prefix, shouldLog)
{
}

mBufferLogStreamConsumerBuffer類型的物件。而LogStreamConsumerBuffer只有 LogStreamConsumerBuffer(std::ostream& stream, const std::string& prefix, bool shouldLog)LogStreamConsumerBuffer(LogStreamConsumerBuffer&& other) 這兩種 constructor,沒有default constructor,因此我們只能用initializer list初始化mBuffer,而不能將它放到{}中去初始化。

TensorRT/samples/opensource/sampleMNIST/sampleMNIST.cpp中同樣也使用了initializer list:

SampleMNIST(const samplesCommon::CaffeSampleParams& params)
    : mParams(params)
{
}

但此處的mParams並非"非靜態常數成員變數"(non-static const data member),“參考成員變數”(reference members),“沒有default constructor的成員變數”(member objects which do not have default constructor)這三者之一,也沒有發生"建構子的參數與成員變數名稱一致"(When constructor’s parameter name is same as data member)的情況,所以此處使用initializer list的原因可能單純就是為了程式運行效率考量。

參考連結

When do we use Initializer List in C++?

Constructors and member initializer lists

发布了90 篇原创文章 · 获赞 9 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/keineahnung2345/article/details/104072936