早些时候,我问为什么这被认为是不好的:
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);
}所以我有点困惑:(如果这个问题被问了一百万次,很抱歉。
发布于 2009-01-19 14:27:48
此question将有助于理解此行为
发布于 2009-01-19 14:28:20
很简单,丹尼尔:
Example *e = new Example();这看起来不像一个叫做"Example“的函数,不是吗?函数有返回值、名称和参数。上面的内容如何适应呢?
示例e1();//这行得通
是的,因为您不需要创建任何Example anywhere实例。您只需告诉代码在周围的名称空间中的某处定义了一个函数,并且您可能希望调用该函数。是的,为了返回一个Example的对象,确实需要创建一个实例。但这并不意味着在这一点上创建了实例。相反,当您调用函数时,会在函数中创建一个实例。
发布于 2009-01-19 14:28:24
嗯..。OK,这是:
示例e1();
不起作用。你可能认为它是这样的,或者一些编译器正在接受它,但它并没有创建一个名为e1的示例实例,它只是声明了一个函数原型。去掉括号,它就会做你想要的事情。
这一点:
Example* e1 =新建Example();
不会工作,因为构造函数是私有的。如果您将构造函数设为公共的,它将在堆上创建对象,而e1将是指向该对象的指针。使用完该对象后,需要将其删除。
https://stackoverflow.com/questions/457719
复制相似问题