2010-09-28 78 views
19

这段代码并不符合我的预期。为什么没有调用构造函数?

#include<iostream> 
using namespace std; 

class Class 
{ 
    Class() 
    { 
     cout<<"default constructor called"; 
    } 

    ~Class() 
    { 
     cout<<"destrutor called"; 
    } 
}; 

int main() 
{  
    Class object(); 
} 

我预计“叫默认构造函数”的输出,但我没有看到任何东西作为输出。问题是什么?

+3

你的构造函数是私有。 – 2010-09-28 07:42:01

+2

@dribeas:这不是最令人头痛的解析;这只是一个有点令人烦恼的解析。 “最令人头疼的解析”通常被保留用于尝试创建一个具有初始化值的直接初始化程序的变量:A a(A());(原来是我的错误) – 2010-09-28 09:31:39

+0

另请参见http:///stackoverflow.com/questions/180172/default-constructor-with-empty-brackets – 2014-10-21 19:27:01

回答

17

没有调用构造器

因为构造函数永远不会被实际调用。

Class object();被解释为功能object的声明不采取任何参数和返回的Class [由值]的物体

尝试Class object;

EDIT

作为麦克注意到这一点是与您提供给编译器的代码不完全相同。是构造函数/析构函数public还是Class一个struct?

但谷歌C++最令人头疼的解析。

+0

在我之前得到了答案_and_重新格式化的职位。 +1 – JoshD 2010-09-28 07:39:07

+0

谢谢@JoshD :) – 2010-09-28 08:18:25

31

没有。你的线Class object();宣布了一个函数。你想写的是Class object;

试一试。

您可能还对最令人头痛的解析感兴趣(如其他人所注意到的)。一个很好的例子是在第33页的Effective STL第6项。(第12次印刷,2009年9月)具体来说,第35页顶部的示例就是您所做的,它解释了解析器为什么将其作为函数声明处理它。

+1

+1,btw Visual C++的问题'警告C4930:原型函数没有调用(是一个变量定义意图?)'在这种情况下。 – sharptooth 2010-09-28 07:44:24

+1

这真的是“最令人头疼的解析”吗?我一直认为这个短语提到了更令人沮丧的问题,即'T x(T())'是一个函数声明。 – 2010-10-21 00:30:26

+0

@詹姆斯麦克奈利斯:那就是斯科特梅耶斯所说的。我不完全同意,我甚至没有立即将这个问题与它联系起来。我认为你的例子更加普遍和令人沮丧。 – JoshD 2010-10-21 16:18:56

0

您可以使用它像这样:

Class obj; 
//or 
Class *obj = new Class(/*constructor arguments*/); 
相关问题