C++中类对象初始化问题,求指导~

以下几种初始化方式有什么不同呢?
不知注释中的理解是否正确?

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.

https://www.cnblogs.com/arxive/p/8418187.html