C ++构造函数没有调用

时间:2013-07-23 10:04:21

标签: c++ constructor

#include<iostream>  
using namespace std;  
class base {  
public:     
    base() {
        cout<<"Constructing base \n";
    }  
    virtual ~base() {
        cout<<"Destructing base \n";
    } 
};  
class derived: public base { 
public:    
    derived() {
        cout<<"Constructing derived \n";
    }    
    ~derived() {
        cout<<"Destructing derived \n";
    }
};   
int main(void) {
    derived d();     
    return 0; 
} 

为什么在这个程序中它没有调用构造函数?

任何人都可以解释一下吗? .......

6 个答案:

答案 0 :(得分:5)

问题是你在这里宣布一个功能:

// function d(), returns a derived object.
derived d();   

您需要的是

derived d; // C++03, C++11

derived d{}; // C++11 only

这是C ++的一个“有趣”方面,其中任何可以被解析为函数声明的东西都是(假设它位于可以声明函数的上下文中)。

GoTW #1 Variable initialization - or is it?中查看有关变量初始化的更多信息。

答案 1 :(得分:4)

试试这样:

int main(void) {  
    derived d;     
    return 0; 
} 

当您键入derived d()时,您正在声明一个函数而不是创建对象。

答案 2 :(得分:3)

宣言不适合derived d();

将其更改为:

int main(void) 
{
  derived d;     // note the difference     
  return 0; 
}    

你在做什么 - &gt; derived d()它声明了一个函数。 返回派生类的实例。

详情请见:http://en.wikipedia.org/wiki/Most_vexing_parse

答案 3 :(得分:2)

这是因为derived d()被视为“函数d,在没有任何参数的情况下调用,返回派生的实例”。谷歌“最令人烦恼的解析”。

答案 4 :(得分:2)

int main(void)
{  
    derived d();     //here you are actually declaring a function
    return 0; 
} 

你应该这样做:

derived d;

然后它会起作用。

答案 5 :(得分:1)

在C ++中,在编译器调用函数之前,它必须知道该函数。您需要在调用之前在流中编写函数,或者至少应该在函数调用之前声明它。因此,通过调用derived d(),您已声明一个名为d()的函数,其返回类型为派生对象,您从未创建derived对象。应该是这样的,

int main() {
   derived d;
   return 0

}