【问题标题】:Why is there no call to the constructor? [duplicate]为什么没有调用构造函数? [复制]
【发布时间】:2011-04-18 03:45:15
【问题描述】:

这段代码的行为与我期望的不一样。

#include<iostream>
using namespace std;

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

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

int main()
{    
    Class object();
}

我期望输出“调用默认构造函数”,但我没有看到任何输出。有什么问题?

【问题讨论】:

  • @dribeas:这并不是最令人头疼的解析;这只是一个有点令人烦恼的解析。 “最令人头疼的解析”通常保留用于尝试使用值初始化临时值的直接初始化器创建变量:A a(A());(最初是我的错误。)

标签: c++ class constructor most-vexing-parse


【解决方案1】:

不。你的行Class object(); 声明了一个函数。你要写的是Class object;

试试看。

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

【讨论】:

  • +1,顺便说一句,Visual C++ 问题warning C4930: prototyped function not called (was a variable definition intended?) 在这种情况下。
  • 这真的是“最令人头疼的解析”吗?我一直认为这句话指的是更令人沮丧的问题,T x(T()) 是一个函数声明。
  • @James McNellis:这就是 Scott Meyers 所说的。我不完全同意,我什至没有立即将这个问题与它联系起来。我认为你的例子更常见也更令人沮丧。
【解决方案2】:

不调用构造函数

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

Class object(); 被解释为函数object 的声明,不带参数并返回Class 的对象[按值]

试试Class object;

编辑

正如 Mike 注意到的,这与您提供给编译器的代码并不完全相同。构造函数/析构函数 public 还是 Class 结构体?

然而 google 对 C++ 最麻烦的解析。

【讨论】:

  • 在我之前得到了答案重新格式化了帖子。 +1
【解决方案3】:

你可以这样使用它:

Class obj;
//or
Class *obj = new Class(/*constructor arguments*/);

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多