C ++类的默认构造函数(C++ Classes default constructor)

2019-09-26 22:08发布

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

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 ++虽然。

我的下一个问题是使用上面,将这一呼吁是有效的?

int main(void)
{
 Example *e = new Example();

 return(0);
}

? 是什么,并简单地调用实施例E之间的差值()??? 就像我知道这是一个函数的原型,但现在看来或许有些编译器原谅,并允许它来调用默认的构造函数? 我想这太:

class Example
{
 private:
  Example();

 public:
  ~Example();
};

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

 return(0);
}

所以我有点糊涂:(很抱歉,如果这个被问了万次。

Answer 1:

这个问题将有助于理解这种行为



Answer 2:

这很容易,丹尼尔:

Example *e = new Example();

这看起来并不像一个名为“示例”功能,不是吗? 一个函数的返回值,名称和参数。 上面会如何适应呢?

实施例E1(); //这个工程

是的,因为你没有创建的任何实例Example的任何地方。 你只要告诉代码,有在周围空间中定义的某一个功能,你可能想调用该函数。 是的,这是真的,为了回报例的对象,实例将作出。 但是,这并不意味着一个实例,在这一点上做。 相反,一个实例在功能上作出,当你调用它。



Answer 3:

嗯... OK这样的:

实施例E1();

不工作。 你可能会认为它做,或者一些编译器接受它,但实例称为E1它不会创建一个实例,它只是声明了一个函数原型。 删除括号和它你想要做什么。

这个:

实施例E1 * =新实例();

不会起作用,因为构造函数是私有的。 如果您构造公众将在堆上创建对象,E1将是一个指针,它指向的对象。 您将需要删除的对象,当你用它做。



Answer 4:

对于将“新实例()”的第一个问题是有效的。 是的,这是完全合法的C ++代码。 虽然是完全正确的,你需要从主()返回之前删除对象,否则会导致内存泄漏。

例:

int main(void)
{
 Example *e = new Example();
 delete e;
 return(0);
}

对于最后一个问题。 行 “例e1();” 是有效的,因为它是声明函数原型。 这实际上并不导致机器代码执行(以及可能堆栈空间)。 它只是说,有一个函数原型不带参数,返回一个类型的例子。

第二行,虽然一定会失败。 此时你正试图实际执行例如构造。 这是不合法的功能的可访问性是私有的,因此编译器错误。



Answer 5:

我想你应该与“这个解析”,“这个编译”,“此链接”和“这个作品”区分,并尝试认为像一个C ++的解析器/编译器/连接自己看到的第一个例子

Example e1(); // function prototype

看起来像一个函数声明。 解析器正是如此理解它,所以你不能调用例如在一个成员函数e1 。 编译器将生成一个符号提及一些功能(它不看还没有),但由于该函数无处使用,也不会抱怨。 如果添加此代码,它会:

e1.f();// since e1 is a function, it has no member 'f' => compiler error

(作为一个旁注:这个代码也可以编译:

int a_function_prototype(int); // another prototype.
e1(); // should work!
a_function_prototype(5);

但是编译完成后,连接器将开始寻找实际的函数体,并没有找到。)

现在,因为该线

Example* e = new Example();

包含关键字的new的编译器识别,并且它知道它只能在配置+新对象的结构可以发现,它会生成代码来这样做。



文章来源: C++ Classes default constructor