gpt4 book ai didi

c++ - C++中的默认构造函数如何初始化变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:36 25 4
gpt4 key购买 nike

给定以下教程中的函数模板。

template<class T>
double GetAverage(T tArray[], int nElements)
{
T tSum = T(); // tSum = 0

for (int nIndex = 0; nIndex < nElements; ++nIndex)
{
tSum += tArray[nIndex];
}

// Whatever type of T is, convert to double
return double(tSum) / nElements;
}

行内

T tSum = T(); // tSum = 0

他们说它将调用特定类型的默认构造函数(基于我们调用此函数的类型)。我怀疑这个调​​用是如何将值赋给 tSum 的,因为这会很好地调用构造函数。但由于构造函数不返回任何内容,因此 iSum 如何初始化为 0(对于 int)或 0.0(对于 double)。

最佳答案

您正在阅读的教程进行了一些严重的术语扭曲/简化。声明说

T tSum = T();

调用“默认构造函数”是不正确的。很明显,在一般情况下类型 T 很容易成为非类类型。非类类型没有任何构造函数,但上述初始化对它们同样有效。

这种情况下的正确术语是值初始化。表达式 T() 生成类型为 T 的临时对象,该对象由 value-initialization 进程初始化。值初始化按照它自己的特定规则工作,它根本不需要任何构造函数。对于非类类型以及类类型的某些类别,它以完全无构造函数的方式进行。

例如,表达式 int() 产生 int 类型的值 0 - 这就是 类型的值初始化的含义int(以及所有标量类型)。当然,它不涉及任何“默认构造函数”,因为 int 类型不可能有任何构造函数。

同样,表达式 T() 不是构造函数调用,因为该教程似乎陈述不正确。表达式 T() 实际上是一个没有操作数的函数式类型转换。正如我上面所说的,没有操作数的函数式类型转换会产生类型为 T 的值初始化的临时对象。它不依赖于构造函数“返回”任何东西。

T() 表达式的临时值然后用作 tSum 对象的初始值设定项。此语法从 T() 调用 tSum 的复制初始化。

关于c++ - C++中的默认构造函数如何初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20513055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com