C++ 初始化列表

简介: C++ 初始化列表


一、基本格式

C++提供了初始化列表语法,用来初始化属性。

基本格式:

构造函数(参数1,参数2,参数3...):属性1(值1),属性2(值2)... {
    // 构造函数体
}

例子

#include <iostream>
using namespace std;
class Person{
public :
        // 初始化列表初始化属性
        Person():m_a(10),m_b(20),m_c(30){
                
        } 
        
        // 初始化列表初始化属性
        Person(int a,int b,int c):m_a(a),m_b(b),m_c(c){
                
        } 
        
        void Print_Info(){
                cout << ">>>>>>>>>>>>>>>>>" << endl;
                cout << "m_a:" << m_a << endl;
                cout << "m_b:" << m_b << endl;
                cout << "m_c:" << m_c << endl;
                cout << "<<<<<<<<<<<<<<<<<" << endl << endl;
        }
private:
        int m_a;
        int m_b;
        int m_c;
};
int main(){
        (Person()).Print_Info();
        (Person(1,2,3)).Print_Info();
}

初始化列表只能初始化一次,初始化列表中的元素不能重复。

编译器允许构造函数赋初值和初始化列表初始化混用。

Person(int a,int b,int c):m_a(a),m_b(b),m_c(c){
    m_a = 20;
}
// 最终结果: m_a 为20

初始化列表的执行是先于构造函数的。

二、使用场景

const成员变量引用成员变量没有默认构造函数的类成员只能在初始化列表初始化。

  • const成员变量必须在定义的时候初始化
  • 引用成员变量必须在定义的时候初始化
  • 没有默认构造函数的类类型成员变量
#include <iostream>
using namespace std;
class Cat {
public:
        string name;
        // 默认构造函数是不用传参就可以调用的构造函数,有三种
        // 1. 无参默认构造函数
        // 2. 所有参数带默认值的构造函数
        // 3. 编译器自动生成的默认构造函数 
        Cat( string name) : name(name){
                // 自定义了构造函数后, 编译器就不会生成默认构造函数 
                // 因此Cat类没有默认构造函数 
        }
};
class SmallCat{
public:
        SmallCat(string name,int weight,int& age):weight(weight),cat(Cat(name)),age(age) {
                
        }
        
        void Print_Info(){
                cout << cat.name << endl;
                cout << weight << endl;
                cout << age << endl;
        }
        
private:
        const int weight;
        Cat cat;
        int & age;
}; 
int main(){
        int age = 2;
        
        (SmallCat("yyrwkk",1,age)).Print_Info();
}

尽量使用初始化列表初始化,初始化列表的执行是在构造函数的用户代码之前。

对于自定义类型成员变量,会先使用初始化列表初始化。

成员变量初始化的顺序是成员变量在类中的声明次序与初始化列表中的先后次序无关

相关文章
|
2天前
|
编译器 C语言 C++
C++一分钟之-C++11新特性:初始化列表
【6月更文挑战第21天】C++11的初始化列表增强语言表现力,简化对象构造,特别是在处理容器和数组时。它允许直接初始化成员变量,提升代码清晰度和性能。使用时要注意无默认构造函数可能导致编译错误,成员初始化顺序应与声明顺序一致,且在重载构造函数时避免歧义。利用编译器警告能帮助避免陷阱。初始化列表是高效编程的关键,但需谨慎使用。
16 2
|
3天前
|
编译器 C++ Windows
C++ 链式继承下的虚函数列表
C++ 链式继承下的虚函数列表
|
1月前
|
编译器 C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(上)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
15 1
|
23天前
|
C++
C++ 类的初始化列表与构造函数初始化的技术性探讨
C++ 类的初始化列表与构造函数初始化的技术性探讨
13 0
|
1月前
|
Java 编译器 C语言
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(下)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
15 0
|
1月前
|
C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(中)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
29 0
|
1月前
|
存储 程序员 编译器
C++11:声明 & 初始化
C++11:声明 & 初始化
16 0
|
1月前
|
安全 程序员 编译器
【C++类和对象】初始化列表与隐式类型转换
【C++类和对象】初始化列表与隐式类型转换
|
3天前
|
C++
C++一分钟之-类与对象初步
【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。
30 2
C++一分钟之-类与对象初步
|
4天前
|
存储 编译器 C++