一、结论
CTest *pt1 = new CTest();
CTest* pt2 = new CTest;
1、若类 CTest 是空类,则二者 new 的结果没有区别。
2、若类存在显示声明的缺省的构造函数,则二者 new 的结果没有区别。
3、若类没有显示声明的缺省的构造函数,即使编译器为类创建了缺省的构造函数,二者的结果依然不一样。带括号的结果是会将 pt1 的 count_ 初始化为0,而不带括号的结果是不初始化 count_ 。
二、验证
1、对于空类,其对象只占1B,两种申请方式没有区别。
2、对于类存在显示声明的缺省的构造函数,两种 new 的时候都会调用该构造函数,所以对于 new 的结果没有影响。
#include <iostream>
class CTest
{
public:
CTest()
{
count_ = 0;
}
public:
size_t count_;
};
int main()
{
CTest *pt1 = new CTest();
CTest* pt2 = new CTest;
std::cout << "()::count_ = " << pt1->count_ << std::endl;
std::cout << "count_ = " << pt2->count_ << std::endl;
std::cin.get();
return 0;
}
结果
()::count_ = 0
count_ = 0
3、对于没有显式声明构造函数的类,即使编译器自动生成了一个构造函数,二者 new 的结果也是不同的。带括号的 new 会对类中成员变量进行初始化,而不带括号的 new 则不采取任何操作。
#include <iostream>
class CTest
{
public:
size_t count_;
public:
virtual void func(){}
};
int main()
{
CTest *pt1 = new CTest();
CTest* pt2 = new CTest;
std::cout << "()::count_ = " << pt1->count_ << std::endl;
std::cout << "count_ = " << pt2->count_ << std::endl;
std::cin.get();
return 0;
}
结果
()::count_ = 0
count_ = 3452816845
(SAW:Game Over!)