C++ 当默认构造函数充当默认参数时,它是如何工作的? 模板 ... 显式Vec(size_type n,const T&T=T()){create(n,T);}

C++ 当默认构造函数充当默认参数时,它是如何工作的? 模板 ... 显式Vec(size_type n,const T&T=T()){create(n,T);},c++,constructor,default-constructor,C++,Constructor,Default Constructor,我在“accelerated c++”中遇到了这个声明,“Vec”类正在模拟STL中“vector”类的行为。但是我不知道如果在调用这个构造函数时不提供第二个参数会发生什么。我对此感到困惑,因为我从书中了解到,任何构造函数都没有返回值?那么如何使用T()来初始化T呢?我是C++初学者。有人能给我详细介绍一下相关的故事吗?T()是一个表达式,它创建了一个类型为T的新实例。因此,T()具有类型Tconst T&T可以保存对T的引用,特别是可以保存对T()创建的对象的引用。如果不向Vec构造函数提供第

我在“accelerated c++”中遇到了这个声明,“Vec”类正在模拟STL中“vector”类的行为。但是我不知道如果在调用这个构造函数时不提供第二个参数会发生什么。我对此感到困惑,因为我从书中了解到,任何构造函数都没有返回值?那么如何使用T()来初始化T呢?我是C++初学者。有人能给我详细介绍一下相关的故事吗?

T()
是一个表达式,它创建了一个类型为
T
的新实例。因此,
T()
具有类型
T
const T&T
可以保存对
T
的引用,特别是可以保存对
T()
创建的对象的引用。如果不向
Vec
构造函数提供第二个参数,则默认情况下
t
将是
t
的任何值

  • 在C++03之前,这是一个很好的例子
  • 从C++03开始,这就是(参见讨论)

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

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

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

template <class T>
...
explicit Vec(size_type n, const T& t = T() ) { create(n, t); }
现在,由于参数exp被定义为可选的,所以在调用函数时可以省略它,因此这个
myMathPowerFunction(2,3)
myMathPowerFunction(2)
,考虑到编译器将为您放置第二个参数
myMathPowerFunction(2,2)

不在模板中,可选参数是类型T的实例。

此特定语句(将其与周围代码隔离)

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


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

在构造函数声明中不指定返回值。但这并不意味着“没有回报价值”。这个返回只是由编译器自动处理的。如果构造函数没有返回任何内容,那么
MyClass变量(a,b,c)将如何返回将新实例分配给
var
变量?欢迎访问该站点!查看和,了解有关提问的更多信息,这些问题将吸引高质量的答案。您可以选择包含更多信息@荆泽宇 对的第二个参数的默认值是使用默认(无参数)构造函数新创建的
T
类型的实例。显然,这意味着模板只适用于那些没有以某种方式删除默认构造函数的类。@CraigYoung这里没有返回值。有一个赋值给引用,例如:
inta;常数int&b=a@super你没抓住要点。将创建并指定一个对象。这种语言的语法糖分对你隐藏了这一点。但是如果不发生这种情况,整个语言就会崩溃。
const t&t=t()
与definition语句中的
t
一样吗@荆泽宇 我知道你是从哪里来的,这是一个好主意,但实际上并不相同。如果直接将
const T&T=T()
替换为
T
,则需要将第二个参数传递给构造函数。如果将其替换为
T=T()
,则更接近。但是,这可能会导致您将临时对象复制到变量
t
中。如果传递的对象类型为
T
,则必须将该对象复制到
T
。常量引用消除了不必要的复制,因此,即使它对用户的用法类似,底层操作也不相同
int myMathPowerFunction(int base, int exp = 2){

}
const T& t = T()