以下几种初始化方式有什么不同呢?
不知注释中的理解是否正确?
class CExample {
private:
int a;
public:
CExample(int b)
{
a = b;
}
CExample(const CExample& b)
{
a = b.a;
}
void Show()
{
cout << a << endl;
}
};
//1.test1 被初始化,执行默认构造函数,在栈上定义
CExample test1;
//2. test1 被初始化,执行默认构造函数,在栈上定义。
CExample test1 = CExample();
//3. test1被初始化,在堆上定义。 与CExample* test1 = new CExample;是否相同?
CExample* test1 = new CExample();
首先,在你的这种情况下,你的三种初始化方式均会报错。
原因在与你没有提供默认构造函数(无参构造函数)。你提供了有参构造函数后,编译器将不再自动提供默认构造函数。因此你的这几种初始化方式编译器会报错没有默认构造函数。
现在,假设你提供了默认构造函数的情况下分析这三种初始化方式:
CExample test1;
CExample test1 = CExample();
这两种方式是一样的,一般使用前一种,调用默认构造函数初始化test1,在栈上定义
CExample* test1 = new CExample(); // 在堆上定义,调用默认构造函数,一般不会这样写,都写成new CExample;
当要指定调用非默认构造函数的时候,才会在后面加上括号并传入相应参数,如
CExample t1(1);
CExample* t2 = new CExample(2);
注意:绝对不能使用CExample t1();这种方式,这种方式编译器 会理解为你声明了一个返回值为CExample类型的t1函数。
而这样写经常会被误认为是调用默认构造函数初始化对象t1.