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 ++的新手。有人可以向我详细说明相关的故事吗?
答案 0 :(得分:2)
此特定声明(将其与周围代码隔离)
const T& t = T()
创建类型为T
的临时对象,然后常量引用函数参数t
则引用该新创建的临时对象的内存位置。构造函数在典型意义上没有返回值,但此过程有效地创建并返回该类型的新对象。
简而言之,这只是创建一个要复制到vector
的默认对象。值得注意的是,如果您的特定类型T
没有像这样的默认构造函数,那么除非您将对象显式传递给第二个参数,否则此调用将失败。
答案 1 :(得分:1)
T()
是一个表达式,用于创建T
类型的新实例。†因此,T()
的类型为T
。 const 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 ...
类型的实例