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();
}

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

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

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

相关文章
|
4月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
115 2
|
5月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
92 30
|
4月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
70 3
|
4月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
73 3
|
4月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
4月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
4月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
30 0
|
6月前
|
Dart API 开发工具
Dart ffi 使用问题之Dart API要在C++中使用,该如何初始化
Dart ffi 使用问题之Dart API要在C++中使用,该如何初始化
|
7月前
|
编译器 C++
【C++】详解初始化列表,隐式类型转化,类静态成员,友元
【C++】详解初始化列表,隐式类型转化,类静态成员,友元
|
8月前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。