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