这些不同的对象结构有什么区别?

时间:2013-11-01 17:01:46

标签: c++ constructor

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()中)?是否使用parens对我来说很困惑。

2 个答案:

答案 0 :(得分:9)

A a;

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

A b();

宣布一个功能。它不会创建对象。

A* ap = new A;

动态分配对象,并如上所述对其进行默认初始化。由于你永远不会删除它,内存泄露。你不应该使用new,除非你真的需要一个动态的生命周期;当你这样做时,通常应该使用智能指针在适当的时候删除它,避免泄漏。

A* bp = new A();

动态分配对象并值初始化。由于没有默认构造函数,因此它会初始化每个数据成员;所以bp->stuff初始化为零。再一次,记忆被泄露了。

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

答案 1 :(得分: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).
}

Most Vexing Parse

一般来说,绝大部分时间都会使用A a;A b();未声明对象的实例。动态内存版本(也需要相应的delete)应该只在极少数情况下使用,并且应该包含在智能指针模板中(例如std::unique_ptrstd::shared_ptr)或者标准容器的一部分(例如std::vectorstd::list)。您很少需要在堆上创建并自行管理它。