构造函数初始化行为
Constructor initialization behavior
不是专家,所以当我注意到以下行为时,我不清楚为什么会这样-希望有人解释一下。
class Example
{
public:
Example() {}
};
int main()
{
Example ex (Example());
cout << typeid(ex).name() << endl;
}
结果为:
class Example __cdecl(class Example (__cdecl*)(void))
非默认构造函数按预期初始化"class Example"的实例。当然,赋值初始化也可以按预期工作。
Example ex2 = Example();
类例子
This
Example ex (Example());
是一个函数声明,名称为ex
,返回类型为Example
,参数类型为Example()
,其中Example()
是一个函数类型,返回类型为Example,没有参数。
相同的声明可以重写为
Example ex (Example ( * )());
,因为作为形参传递的函数隐式地转换为指向函数的指针。
在这种情况下,如果你想调用复制构造函数,你必须提供一个表达式作为参数
Example ex ( ( Example() ) );
或
Example ex ( { Example() } );
对于这个声明
Example ex2 = Example();
则使用了一个初始化式,该初始化式是一个表达式,它表示自己是对默认构造函数的调用。
考虑这个令人困惑的笑的例子
#include <iostream>
class Example
{
public:
Example() {}
};
Example ex() { return Example(); }
int main()
{
Example ex( Example() );
ex( ::ex );
}
Example ex( Example ( ex() ) )
{
std::cout << "Example ex( Example ( ex() ) ) is called" << std::endl;
return ex();
}
相关文章:
- 为什么std::vector和std::valarray初始化构造函数不同
- 初始化构造函数C++中结构的向量
- C++ 中常量属性的初始化构造函数错误
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何通过参数初始化构造函数中的数组?
- 是否有理由使用 malloc 初始化构造函数中的指针
- 如何在 c++ 中初始化构造函数中的二维数组
- 为什么初始化构造函数列表参数时会发生异常?
- 无法初始化构造函数
- 初始化构造函数的默认参数的优选方法是什么?
- 在C++17中使用空列表初始化构造函数时发生编译错误
- C++ 初始化构造函数初始化列表中的嵌套结构?
- 初始化构造函数c++中的向量
- g++ (GCC) 4.6.0 我有以下类,我正在尝试初始化构造函数的结构成员初始化列表
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- 初始化构造函数C++中函数的成员指针
- 在c++中初始化构造函数中的静态成员变量时出错
- memset()初始化构造函数中的对象
- 初始化构造函数C++中的成员向量