当默认构造函数作为默认参数时,它是如何工作的?

时间:2018-03-24 14:33:25

标签: c++ constructor default-constructor

template <class T>
...
explicit Vec(size_type n, const T& t = T() ) { create(n, t); }

我在加速c ++&#39;中遇到了这个声明。和Vec&#39; class正在模拟&vector;&#39; vector&#39; STL课程。但是,如果我在调用此构造函数时没有提供第二个参数,我就不知道将会发生什么。我对此感到困惑,因为我从书中了解到任何构造函数都没有返回值?那么T()如何用于初始化t?我是C ++的新手。有人可以向我详细说明相关的故事吗?

4 个答案:

答案 0 :(得分:2)

此特定声明(将其与周围代码隔离)

const T& t = T()

创建类型为T的临时对象,然后常量引用函数参数t则引用该新创建的临时对象的内存位置。构造函数在典型意义上没有返回值,但此过程有效地创建并返回该类型的新对象。

简而言之,这只是创建一个要复制到vector的默认对象。值得注意的是,如果您的特定类型T没有像这样的默认构造函数,那么除非您将对象显式传递给第二个参数,否则此调用将失败。

答案 1 :(得分:1)

T()是一个表达式,用于创建T类型的新实例。†因此,T()的类型为Tconst T& t可以保留对T的引用,特别是可以保存对T()创建的内容的引用。如果您未向Vec构造函数提供第二个参数,则t将默认为T

答案 2 :(得分:0)

如果未明确提供第二个参数,则编译器使用默认构造函数T()创建一个临时对象,并将对该临时对象的常量引用作为第二个参数传递。

答案 3 :(得分:0)

第二个参数是默认/可选参数,这意味着如果省略它,它将自动假定为T()或T的新实例...

有关可选参数如何工作的示例

int myMathPowerFunction(int base, int exp = 2){

}

现在,由于参数exp被定义为可选,因此在调用函数时可以省略它,因此myMathPowerFunction(2, 3)myMathPowerFunction(2),考虑到编译器将为您myMathPowerFunction(2, 2)

添加第二个参数

不在您的模板中,可选参数是T ...

类型的实例