qixibujiabing 2020-03-18 19:01 采纳率: 50%
浏览 181
已采纳

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();


  • 写回答

2条回答 默认 最新

  • BugM 2020-03-19 13:28
    关注

    首先,在你的这种情况下,你的三种初始化方式均会报错。
    原因在与你没有提供默认构造函数(无参构造函数)。你提供了有参构造函数后,编译器将不再自动提供默认构造函数。因此你的这几种初始化方式编译器会报错没有默认构造函数。

    现在,假设你提供了默认构造函数的情况下分析这三种初始化方式:
    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题