2
class A
{
public:
    int get(void){return stuff;}
    void set(int s){stuff = s;}

private:
    int stuff;
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    A b();
    A* ap = new A;
    A* bp = new A();
}

我不知道 main() 中的四行之间有什么区别,以及我可能会使用哪一种情况(除了在堆栈或堆上)。我注意到第四行实际上将“stuff”初始化为 0,而其他行没有。第二行似乎根本没有任何东西,这似乎很奇怪。

问题:每行的权衡/含义是什么(在 main() 中)?是否使用括号让我感到困惑。

4

2 回答 2

9
A a;

那是默认初始化。由于没有默认构造函数,每个数据成员都是默认初始化的;所以a.stuff留下一个不确定的值。

A b();

那声明了一个函数。它不会创建对象。

A* ap = new A;

这会动态分配一个对象,并如上所述默认初始化它。由于您从不删除它,因此内存已泄漏。new除非您确实需要动态生命周期,否则不应使用;当你这样做时,你通常应该使用智能指针在正确的时间删除它,避免泄漏。

A* bp = new A();

这会动态分配一个对象并对其进行值初始化。由于没有默认构造函数,它对每个数据成员进行值初始化;所以bp->stuff初始化为零。再次,内存泄漏。

如果该类有一个默认构造函数,那么默认初始化和值初始化将是相同的;两者都会调用构造函数。

于 2013-11-01T17:06:54.877 回答
2
int _tmain(int argc, _TCHAR* argv[])
{
    A a; // creates a local automatic variable of type A
    A b(); // See Most Vexing Parse
    A* ap = new A; // creates a new object of type A on the heap using the default constructor (which the compiler implements for you since you didn't declare one)
    A* bp = new A(); // creates a new object of type A on the heap using value initialization (effectively the same as above).
}

最烦人的解析

一般来说,您将使用A a;绝大多数时间。 A b();不声明对象的实例。动态内存版本(也需要相应delete的 s)应该只在极少数情况下使用,并且应该包装在智能指针模板中(例如std::unique_ptr, std::shared_ptr)或作为 std 容器的一部分(例如std::vector, std::list)。您必须在堆上创建一些东西并自己管理它是非常罕见的。

于 2013-11-01T17:12:51.690 回答