最近写demo的时候,new一个类的时候,有时忘了加(),即 A *pA = new A; A *pA = new A();这两个写法有区别吗? 写一个简单的代码验证下:
class new_test
{
public:
void print_fun() {
std::cout << "new_test:" << test_ << std::endl;
}
private:
int test_;
};
int main()
{
new_test* p1 = new new_test;
p1->print_fun();
new_test* p2 = new new_test();
p2->print_fun();
}
new_test:-842150451
new_test:0
如果我们定义了类的默认构造函数,即如下:
class new_test
{
public:
new_test() {}
void print_fun() {
std::cout << "new_test:" << test_ << std::endl;
}
private:
int test_;
};
new_test:-842150451
new_test:-842150451
请按任意键继续. . .
发现现在是一致的。查资料,发现是第一种情况下:p1执行的是默认初始化,p2执行的是值初始化。但是对于默认构造是否是用户写的也是有区别的(第二种情况)。
结论:自己的类最好定义一个默认构造函数,并且初始化所有需要初始化的变量,防止出现莫名其妙的问题