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)
{
}
mOutput
是std::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)
{
}
mBuffer
是LogStreamConsumerBuffer
類型的物件。而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的原因可能單純就是為了程式運行效率考量。