构造函数初始化行为

Constructor initialization behavior

本文关键字:初始化 构造函数      更新时间:2023-10-16

不是专家,所以当我注意到以下行为时,我不清楚为什么会这样-希望有人解释一下。

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();
}