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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值