当前位置: 首页 > article >正文

C++ 初始化列表:成员变量的 “快速入场券”

关于构造函数请点这里

1. 语法形式

初始化列表以冒号(:)开头,位于构造函数的参数列表之后、函数体之前,后跟一系列以逗号分隔的初始化字段。每个初始化字段由成员变量名和括号内的初始值(或用于初始化的表达式)组成。例如:

class MyClass {
private:
    int num;
    double d;
public:
    MyClass(int n, double x) : num(n), d(x) {
        // 构造函数体,这里可以有其他操作
    }
};

2. 执行阶段

从概念上讲,构造函数的执行分为初始化阶段和计算阶段,初始化列表在初始化阶段起作用,且先于构造函数体内的计算阶段执行。所有类类型的成员都会在初始化阶段初始化,即便该成员未出现在初始化列表中,此时会调用其默认构造函数(若存在)。示例如下:

#include <iostream>
class Test1 {
public:
    Test1() { std::cout << "Test1 default constructor" << std::endl; }
};
class Test2 {
public:
    Test1 t1;
    Test2() : t1() {  // 这里的t1()可省略,因为会默认调用Test1的默认构造函数
        std::cout << "Test2 constructor body" << std::endl; 
    }
};
int main() {
    Test2 t; 
    return 0;
}

上述代码中,先调用Test1的默认构造函数,再执行Test2构造函数体的内容。

 3.初始化必要成员 const和引用类型

对于const成员变量、引用成员变量以及没有默认构造函数的类类型成员变量,必须在初始化列表中进行初始化。因为const成员一旦初始化就不能更改,引用必须在定义时初始化且不能重新赋值,没有默认构造函数的类类型无法通过默认方式初始化。例如:

class MyClass {
private:
    const int num;
    int& ref;
    class NoDefaultCtor {
    public:
        NoDefaultCtor(int n) : value(n) {}
        int value;
    };
    NoDefaultCtor obj;
public:
    MyClass(int n, int& r) : num(n), ref(r), obj(n) { 
    }
};

4. 初始化顺序

 成员变量在初始化列表中的初始化顺序并非按照列表中的先后顺序,而是按照它们在类中声明的顺序进行初始化。因此,为了增强代码的可读性和避免潜在问题,建议初始化列表中成员的顺序与声明顺序保持一致。

class Example {
private:
    int a;
    int b;
public:
    Example(int x)
   : b(x), 
    a(b) { 
        // 这里a先于b被声明,所以先初始化a,此时b未初始化,a的值不确定
    }
};

初始化列表总结:

⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;

⽆论是否在初始化列表显⽰初始化,每个成员变量都要⾛初始化列表初始化;

 


http://www.kler.cn/a/577143.html

相关文章:

  • 内核编程七:Linux 内核日志的级别
  • 大白话CSS 优先级计算规则的详细推导与示例
  • DBeaver 25.0 社区版安装与数据库连接配置指南(Windows平台)
  • C++11语法糖:auto和范围for循环详解
  • lvgl在ubuntu中模拟运行
  • win11 Visual Studio 17 2022源码编译 opencv4.11.0 + cuda12.6.3 启用GPU加速
  • 新能源汽车充电综合解决方案:安科瑞电气助力绿色出行
  • 青少年编程与数学 02-010 C++程序设计基础 29课题、继承
  • 常用AI工具推荐
  • Python包结构与 `__init__.py` 详解
  • 如何用postman设置接口测试关联
  • CentOS 最新系统安装 Redis 7.0.11 详细指南
  • PyTorch深度学习框架60天进阶学习计划第16天:循环神经网络进阶!
  • Web3的技术挑战:去中心化的可扩展性与性能问题
  • 【保姆级 HAL 库学习定时器】
  • C语言-语法
  • 【linux网络编程】文件描述符
  • C++题解(32) 2025顺德一中少科院信息学创新班(四期)考核复盘 U536935 黑白图像
  • JavaScript基础-比较运算符
  • springcloud sentinel教程