初始化参数列表
用于在构造函数中初始化类的数据成员。
语法:构造函数():属性1(值1),属性2(值2)......{ }
性质:
1.只能在构造函数中使用
2.引用 或 常量必须在初始化参数列表中初始化
3.初始化的顺序和成员变量的顺序一致,与初始化参数列表中的顺序无关
#include<iostream>
#include<vector>
using namespace std;
class A {
int a;
int b;
int c;
int& e;
const int d;
public:
A(int a1, int b1, int c1) :b(a), a(a1), c(c1), e(a1), d(b1) {
e = a1;//报错,构造函数用于给成员变量赋值,引用不能在构造函数中初始化
cout << a << " " << b << " " << c;
}
};
int main() {
A p(1, 2, 3);
return 0;
}
初始化列表的做用:
1)初始化const和引用成员
对于 const (常量)成员变量和引用类型的成员变量,它们在定义后不能再被赋值
class fun {
const int a;
int& b;
public:
//在这个构造函数的初始化列表中,可以对 const 成员 a 和引用成员 b 进行初始化。
fun(int x, int& y) : a(x), b(y) {
}
};
2)提高效率
对于一些复杂的对象,如包含其他对象的类。如果不用初始化列表,而是在构造函数体内赋值,会先调用默认构造函数创建成员对象,然后再调用赋值运算符进行赋值。而使用初始化列表可以直接调用拷贝构造函数初始化成员对象,避免了不必要的默认构造过程,从而提高了效率。
3)保证初始化顺序
成员变量的初始化顺序是按照它们在类定义中出现的顺序,而不是初始化列表中的顺序。这有助于明确成员初始化的顺序,避免因顺序混乱导致的错误。
初始化列表和在构造函数体内赋值的区别:
1.初始化时机
列表初始化:
是在对象创建时进行初始化,属于初始化阶段。成员变量在进入构造函数体之前就已经完成初始化。
构造函数体内赋值:
是在对象已经初始化完成后,在构造函数的执行体中对成员变量进行赋值操作。
2.性能差异
列表初始化:
对于基本类型和一些简单对象,性能差异可能不明显。但对于复杂对象,特别是涉及到资源获取(如动态内存分配)的成员,列表初始化可以避免先默认构造再赋值的过程,效率更高。
构造函数体内赋值:
如果对象有默认构造函数,先调用默认构造函数进行初始化,之后在构造函数体内又进行赋值操作,可能会涉及额外的资源消耗和时间开销。
3.初始化要求
列表初始化:
如前所述,不允许窄化转换,能保证数据的安全性和准确性。
构造函数体内赋值:
可以进行隐式类型转换,这可能会导致数据丢失或不符合预期的结果,当然也可以通过一些手段(如 explicit 关键字)来控制类型转换。
标签:初始化,int,成员,C++,列表,赋值,构造函数 From: https://blog.csdn.net/2401_88249494/article/details/143921933