首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++类默认构造函数

C++类默认构造函数
EN

Stack Overflow用户
提问于 2009-01-19 14:22:52
回答 5查看 4.1K关注 0票数 1

早些时候,我问为什么这被认为是不好的:

代码语言:javascript
复制
class Example
{
 public: 
  Example(void);
  ~Example(void);
  void f() {}
}

int main(void)
{
 Example ex(); // <<<<<< what is it called to call it like this?

 return(0);
}

现在,我知道它是在创建一个函数原型,而不是返回一个类型示例。我仍然不明白为什么它会在g++和MS VC++中工作。

我的下一个问题是使用上面的,这个调用是否有效?

代码语言:javascript
复制
int main(void)
{
 Example *e = new Example();

 return(0);
}

?这和简单地调用示例e()有什么区别?就像我知道它是一个函数原型,但它似乎可能是一些编译器原谅了这一点,并允许它调用默认构造函数?我也试过了:

代码语言:javascript
复制
class Example
{
 private:
  Example();

 public:
  ~Example();
};

int main(void)
{
 Example e1(); // this works
 Example *e1 = new Example(); // this doesn't

 return(0);
}

所以我有点困惑:(如果这个问题被问了一百万次,很抱歉。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-19 14:27:48

question将有助于理解此行为

票数 1
EN

Stack Overflow用户

发布于 2009-01-19 14:28:20

很简单,丹尼尔:

代码语言:javascript
复制
Example *e = new Example();

这看起来不像一个叫做"Example“的函数,不是吗?函数有返回值、名称和参数。上面的内容如何适应呢?

示例e1();//这行得通

是的,因为您不需要创建任何Example anywhere实例。您只需告诉代码在周围的名称空间中的某处定义了一个函数,并且您可能希望调用该函数。是的,为了返回一个Example的对象,确实需要创建一个实例。但这并不意味着在这一点上创建了实例。相反,当您调用函数时,会在函数中创建一个实例。

票数 5
EN

Stack Overflow用户

发布于 2009-01-19 14:28:24

嗯..。OK,这是:

示例e1();

不起作用。你可能认为它是这样的,或者一些编译器正在接受它,但它并没有创建一个名为e1的示例实例,它只是声明了一个函数原型。去掉括号,它就会做你想要的事情。

这一点:

Example* e1 =新建Example();

不会工作,因为构造函数是私有的。如果您将构造函数设为公共的,它将在堆上创建对象,而e1将是指向该对象的指针。使用完该对象后,需要将其删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/457719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档