列表成员初始化

成员初始化列表

成员初始化列表是构造函数的一部分,位于构造函数参数列表之后和构造函数体之前。它用于直接初始化类的成员变量。成员初始化列表的语法如下:

ClassName::ConstructorName(参数列表) : 成员变量1(初始值1), 成员变量2(初始值2), ... {
    // 构造函数体
}

示例解释

在示例代码中:

class Shallow {
public:
    Shallow(int size) : size(size) {
        data = new int[size]; // 动态分配内存
        for (int i = 0; i < size; ++i) {
            data[i] = i;
        }
    }

    // 拷贝构造函数:执行浅拷贝
    Shallow(const Shallow& source) : size(source.size), data(source.data) {
        std::cout << "Shallow Copy Constructor Called" << std::endl;
    }

    ~Shallow() {
        delete[] data; // 释放内存
        std::cout << "Destructor Called" << std::endl;
    }

    void display() const {
        for (int i = 0; i < size; ++i) {
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }

private:
    int* data;
    int size;
};

这里的 Shallow(int size) : size(size) 部分做了以下事情:

  1. Shallow(int size) 是构造函数的声明,接受一个 int 类型的参数 size
  2. : size(size) 是成员初始化列表,初始化成员变量 size,将构造函数参数 size 的值赋给类的成员变量 size

这等同于在构造函数体中写 this->size = size;,但成员初始化列表在一些情况下更高效和必要,特别是对于常量成员、引用成员和需要复杂初始化的成员。

为什么使用成员初始化列表

  1. 效率:对于内置类型和简单对象,成员初始化列表和在构造函数体内赋值差别不大。但对于自定义类类型,成员初始化列表可以避免一次默认构造和一次赋值,直接调用参数化构造函数,提高效率。
  2. 不可变成员:对于 const 成员或引用成员,必须使用成员初始化列表,因为它们在构造函数体内不能被赋值。
  3. 初始化顺序:成员初始化列表按照成员声明的顺序进行初始化,而不是在列表中出现的顺序。这可以避免一些顺序依赖的问题。

成员初始化列表的正确使用

确保在成员初始化列表中初始化所有需要的成员,并按照声明顺序书写:

class Example {
public:
    Example(int a, int b) : member1(a), member2(b) {
        // 构造函数体
    }

private:
    int member1;
    int member2;
};
  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值