早些时候,我问为什么这被认为是不好:
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);
}
所以我有点糊涂:(很抱歉,如果这个被问了万次。
这很容易,丹尼尔:
Example *e = new Example();
这看起来并不像一个名为“示例”功能,不是吗? 一个函数的返回值,名称和参数。 上面会如何适应呢?
实施例E1(); //这个工程
是的,因为你没有创建的任何实例Example
的任何地方。 你只要告诉代码,有在周围空间中定义的某一个功能,你可能想调用该函数。 是的,这是真的,为了回报例的对象,实例将作出。 但是,这并不意味着一个实例,在这一点上做。 相反,一个实例在功能上作出,当你调用它。
嗯... OK这样的:
实施例E1();
不工作。 你可能会认为它做,或者一些编译器接受它,但实例称为E1它不会创建一个实例,它只是声明了一个函数原型。 删除括号和它你想要做什么。
这个:
实施例E1 * =新实例();
不会起作用,因为构造函数是私有的。 如果您构造公众将在堆上创建对象,E1将是一个指针,它指向的对象。 您将需要删除的对象,当你用它做。
对于将“新实例()”的第一个问题是有效的。 是的,这是完全合法的C ++代码。 虽然是完全正确的,你需要从主()返回之前删除对象,否则会导致内存泄漏。
例:
int main(void)
{
Example *e = new Example();
delete e;
return(0);
}
对于最后一个问题。 行 “例e1();” 是有效的,因为它是声明函数原型。 这实际上并不导致机器代码执行(以及可能堆栈空间)。 它只是说,有一个函数原型不带参数,返回一个类型的例子。
第二行,虽然一定会失败。 此时你正试图实际执行例如构造。 这是不合法的功能的可访问性是私有的,因此编译器错误。
我想你应该与“这个解析”,“这个编译”,“此链接”和“这个作品”区分,并尝试认为像一个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
的编译器识别,并且它知道它只能在配置+新对象的结构可以发现,它会生成代码来这样做。