当默认构造函数充当默认参数时,它是如何工作的
How does it works when a default constructor acts as a default argument?
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()
具有类型 T
。 const 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...
- 默认初始化无法正常工作
- 如何更改 Excel DSN 的默认工作簿?
- 默认操作员如何在C 中工作
- 当默认构造函数充当默认参数时,它是如何工作的
- 默认区域设置"root"在 ICU 中如何工作?
- 隐式删除的默认构造函数在 C++14 中工作
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 继承默认构造函数在 gcc 中失败并在 clang 中工作,哪个有错误?
- 默认情况下,从工作线程发出Qt::信号会使主线程上的UI更新?
- 编译器生成的默认构造函数工作 - C++
- C++:析构函数内部如何工作以及谁调用默认析构函数
- float如何在输入和默认值的C 中工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- 变量args SFINAE默认构造函数在clang中工作,但在Visual Studio 2015中失败
- 默认情况下,任何函数是否能够就地工作
- 正在使默认构造函数和初始值设定项列表并行工作
- VS 2012 更改默认调试"工作目录"
- QAxObject Excel工作表--为整个Excel工作表设置默认字体
- Iostream中包含的Ctype方法默认情况下在程序中的固定区域设置中工作吗
- 当我使用DC时,我应该总是在默认对象完成工作后用新对象替换它吗