成员初始化列表(member initializer list)

成员初始化列表(member initializer list)

只有构造函数可以使用初始化列表句法。

类对象const成员的动态初始化

 

     对于const数据成员,必须在执行到构造函数之前,即创建对象时进行初始化。因此其构造函数中的初始化方法为:

 

ClassName::ClassName(val):CdataA(val),CdataB(val*2+1){.....;}

 

(成员初始化列表由逗号分隔的初始化列表组成,前面带冒号。它位于参数列表的右括号之后、函数体左括号之前)

 

通常,初值可以是常量或构造函数的参数列表中的形参。
并且,这种方法并不限于初始化常量。

 

初始化引用数据成员

对于在类中被声明为引用的类成员,也必须使用这种方法。因为引用与const数据类似,只能在被创建时进行初始化:

 

class ClassName_A {....};
class ClassName_B
{
 private:
        ClassName_A & belong;
        ....;
};
ClassName_B::ClassName_B (ClassName_A & A):belong(A){...;}

 


 

 

 

    成员初始化列表中使用的括号方式也可用于常规的初始化中。
    可以将下述代码:
    int games = 500;
    double Pi = 3.1415;
替换为:
    int games(500);
    double Pi(3.1415);

### C++ 初始化列表的使用方法 在 C++ 中,初始化列表是一种用于构造函数中初始化成员的技术。它不仅能够提升程序性能,还能解决一些特定场景下的问题,比如 `const` 类型变量和引用类型的初始化。 #### 初始背景 当定义一个类时,如果该类包含某些特殊类型的成员(如 `const` 变量、引用类型),则这些成员无法通过普通的赋值方式进行初始化[^1]。此时,初始化列表成为唯一的选择。此外,相比在构造函数体内的赋值操作,初始化列表通常具有更高的执行效率[^2]。 --- #### 使用方法 ##### 1. **基本语法** 初始化列表位于构造函数声明之后,在大括号 `{}` 开始之前,形式如下: ```cpp ClassName(ConstructorParameters) : Member1(Value1), Member2(Value2), ... {} ``` 其中: - `MemberX` 是类的成员变量; - `ValueX` 是对应的初始值。 --- ##### 2. **常见应用场景** ###### (1)初始化 `const` 成员变量 对于 `const` 类型的成员变量,必须在初始化列表中完成初始化,因为它们一旦被赋予初值便不可更改。 示例代码: ```cpp class Example { public: Example(int value) : constVar(value) {} // 在初始化列表中设置 constVar 的值 void display() { std::cout << "Const Variable: " << constVar << std::endl; } private: const int constVar; }; ``` ###### (2)初始化引用成员 引用类型的成员也必须通过初始化列表进行初始化,因为它不能像普通变量那样重新绑定到其他对象上。 示例代码: ```cpp class RefExample { public: RefExample(int& refVal) : ref(refVal) {} // 初始化引用成员 void modifyRef(int newValue) { ref = newValue; } private: int& ref; // 引用成员 }; ``` ###### (3)提高性能 相比于在构造函数体内逐个赋值,初始化列表可以直接将成员变量绑定到其初始值,从而避免不必要的临时对象创建或拷贝过程。 示例对比: 传统方式(低效): ```cpp class TraditionalInit { public: TraditionalInit(int a, int b, int c) { memberA = a; // 赋值操作可能涉及额外开销 memberB = b; memberC = c; } private: int memberA, memberB, memberC; }; ``` 初始化列表方式(高效): ```cpp class EfficientInit { public: EfficientInit(int a, int b, int c) : memberA(a), memberB(b), memberC(c) {} // 绑定至初始值 private: int memberA, memberB, memberC; }; ``` --- ##### 3. **委托构造函数** 自 C++11 起引入了委托构造函数的概念,即可以通过某个构造函数调用同一类中的另一个构造函数来实现部分功能共享[^3]。 示例代码: ```cpp class DelegatingConstructor { public: DelegatingConstructor(int val) : DelegatingConstructor(val, 0) {} // 委托给第二个构造函数 DelegatingConstructor(int val1, int val2) : x(val1), y(val2) {} void showValues() { std::cout << "x=" << x << ", y=" << y << std::endl; } private: int x, y; }; // 测试代码 DelegatingConstructor obj(5); obj.showValues(); // 输出:x=5, y=0 ``` --- ##### 4. **支持标准库容器** 除了上述用途外,初始化列表还可以配合 STL 容器一起工作,例如利用 `std::initializer_list` 来简化批量数据处理逻辑[^4]。 示例代码: ```cpp #include <vector> #include <iostream> class Players { public: void Add(const std::initializer_list<int>& ilist) { for (auto it = ilist.begin(); it != ilist.end(); ++it) { players.push_back(*it); // 将 initializer_list 数据加入 vector } } void Display() { for (int player : players) { std::cout << player << ' '; } std::cout << '\n'; } private: std::vector<int> players; }; // 测试代码 Players game; game.Add({1, 2, 3, 4}); // 使用 initializer_list 添加多个玩家编号 game.Display(); // 输出:1 2 3 4 ``` --- ### 总结 初始化列表是 C++ 构造函数的重要组成部分,适用于多种复杂情况下的成员变量初始化需求。合理运用它可以显著优化代码结构并增强程序性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值