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条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘