• 【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )



    构造函数初始化列表 总结 :

    • 初始化列表 可以 为 类的 成员变量 提供初始值 ;
    • 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ;
    • 初始化列表 可以 使用 构造函数 中传入的 参数 ;
    • 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ;
    • 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行 初始化 , 所有的构造函数都要进行初始化操作 ;




    一、构造函数 的 初始化列表 中 为 const 成员变量初始化




    1、初始化 const 常量成员


    如果 类 中定义了 被 const 修饰 的 成员变量 , 那么该成员变量 必须被初始化 , 否则会报错 ;

    对象中的 const 成员 必须在 声明后 立刻进行初始化 ;

    const 成员的初始化 只能通过 构造函数 的 初始化列表 进行初始化 ;

    注意 : 这里区分 初始化 与 赋值 ,

    • 初始化 是 变量 声明时 同时 为其 设置一个 初始化值 ;
    • 赋值 是 变量 声明以后 , 再对变量进行赋值 ;

    const 成员变量 是常量 , 是 无法在声明后 进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表中 对 const 成员变量 进行赋值 ;


    2、错误代码示例 - 没有初始化常量成员


    在下面的 类 B 中 , 定义了常量 const int m_const_int;

    没有对该常量 进行初始化 操作 , 在编译运行时 , 就会报错 ;

    class B
    {
    public:
    	B() : m_age(10), m_a(10, 150)
    	{}
    
    	// 构造函数中的参数可以作为 参数列表 中的参数值
    	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA)
    	{
    		cout << "执行 B 的构造函数" << endl;
    	}
    
    	~B()
    	{
    		cout << "执行 B 的析构函数" << endl;
    	}
    public:
    	int m_age;		// 年龄
    	A m_a;			// A 类型成员变量
    	const int m_const_int;	// 常量成员
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果 :

    已启动生成…
    1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
    1>hello_world.cpp
    1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(29,2): error C2789: “B::m_const_int”: 必须初始化常量限定类型的对象
    1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(44): message : 参见“B::m_const_int”的声明
    1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(33,2): error C2789: “B::m_const_int”: 必须初始化常量限定类型的对象
    1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(44): message : 参见“B::m_const_int”的声明
    1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在编译时 , 所有的 构造函数 上 , 都会报错 ;

    所有的 构造函数 中 , 都必须 在 初始化列表中 , 对 常量成员 进行初始化操作 ;

    在这里插入图片描述


    3、正确代码示例 - 在初始化列表中初始化常量成员


    在下面的 类 B 中 , 所有的 构造函数 中 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数 没有对 常量成员 进行初始化 , 就会报错 ;


    代码示例 :

    class B
    {
    public:
    	B() : m_age(10), m_a(10, 150), m_const_int(888)
    	{}
    
    	// 构造函数中的参数可以作为 参数列表 中的参数值
    	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA), m_const_int(888)
    	{
    		cout << "执行 B 的构造函数" << endl;
    	}
    
    	~B()
    	{
    		cout << "执行 B 的析构函数" << endl;
    	}
    public:
    	int m_age;		// 年龄
    	A m_a;			// A 类型成员变量
    	const int m_const_int;	// 常量成员
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果 :

    在这里插入图片描述


    4、完整代码示例


    完整代码示例 :

    #include "iostream"
    using namespace std;
    
    class A
    {
    public:
    	// 带参构造函数
    	A(int age, int height)
    	{
    		m_age = age;
    		m_height = height;
    		cout << "执行 A 的构造函数" << endl;
    	}
    
    	~A()
    	{
    		cout << "执行 A 的析构函数" << endl;
    	}
    
    public:
    	int m_age;		// 年龄
    	int m_height;	// 身高
    };
    
    class B
    {
    public:
    	B() : m_age(10), m_a(10, 150), m_const_int(888)
    	{}
    
    	// 构造函数中的参数可以作为 参数列表 中的参数值
    	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA), m_const_int(888)
    	{
    		cout << "执行 B 的构造函数" << endl;
    	}
    
    	~B()
    	{
    		cout << "执行 B 的析构函数" << endl;
    	}
    public:
    	int m_age;		// 年龄
    	A m_a;			// A 类型成员变量
    	const int m_const_int;	// 常量成员
    };
    
    
    int main()
    {
    	// 通过 B 的有参构造函数
    	// 其中 构造函数中的参数 作为 参数列表 中的参数值
    	B b(10, 10, 150);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    执行结果 :

    执行 A 的构造函数
    执行 B 的构造函数
    Press any key to continue . . .
    执行 B 的析构函数
    执行 A 的析构函数
    
    D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 20756)已退出,代码为 0。
    要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
    按任意键关闭此窗口. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    python+vue+elementui学生选课作业系统wxjjv
    函数对象使用
    028-GUI事件处理,ActionListener事件,MouseListener事件
    行业追踪,2023-10-09
    Leetcode刷题16. 最接近的三数之和
    VR开发(一)——SteamVR实现摇杆移动
    AtCoder Beginner Contest 264(A-D)
    RocketMQ这样做,压测后性能提高30%
    selenium⾃动化测试⾯试题及答案,看看你会多少?
    欧拉计划Python解法(第1题-第5题)
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133015280