构造函数初始化行为

时间:2015-10-25 14:14:46

标签: c++ constructor initialization

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

class Example 
{
   public: 
   Example() {}
};

int main()
{
  Example ex (Example()); 
  cout << typeid(ex).name() << endl;    
}

结果:

  

class Example __cdecl(class Example(__ cdecl *)(void))

非默认构造函数初始化&#34;类的实例&#34;正如所料。当然,赋值初始化也可以按预期工作。

Example ex2 = Example();  
  

类示例

1 个答案:

答案 0 :(得分:3)

Example ex (Example()); 

是一个名为ex的函数声明,其返回类型为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();
}