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

How does it works when a default constructor acts as a default argument?

本文关键字:默认 何工作 工作 构造函数 参数      更新时间:2023-10-16
template <class T>
...
explicit Vec(size_type n, const T& t = T() ) { create(n, t); }

我在"加速 c++"中遇到了这个声明,"Vec"类正在模拟 STL 中"vector"类的行为。但是我不知道如果我在调用这个构造函数时不提供第二个参数会发生什么。我对此感到困惑,因为我从书中了解到没有任何构造函数的返回值?那么如何使用 T(( 来初始化 t呢?我是C++的新手。谁能向我详细说明相关故事?

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

const T& t = T()

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

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

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

  • 在 C++03 之前,这是默认初始化。
  • 从 C++03 开始,这是值初始化(请参阅此处的讨论(

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

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

有关可选参数工作原理的示例

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

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

不在模板中,可选参数是类型为 T...