在 C++编程中,初始化列表(Initializer List)是一种在对象创建时进行成员变量初始化的强大工具。
一、什么是初始化列表
初始化列表是在构造函数的参数列表之后、函数体开始之前,使用冒号 :
后跟一组以逗号分隔的成员变量初始化表达式。
class MyClass {
int num;
std::string str;
public:
MyClass(int n, const std::string& s) : num(n), str(s) {}
};
二、为什么使用初始化列表
-
效率优势
对于一些类型,如引用和 const 成员变量,必须使用初始化列表进行初始化。而且对于没有默认构造函数的类成员,也只能通过初始化列表来正确初始化。 -
避免不必要的默认初始化
使用初始化列表可以直接对成员变量进行指定值的初始化,避免了先进行默认初始化再赋值的两步操作,提高了性能。
三、初始化列表的顺序
初始化列表中成员变量的初始化顺序与它们在类中的声明顺序相同,而与初始化列表中的顺序无关。
class MyClass {
int num1;
int num2;
public:
MyClass(int n1, int n2) : num2(n2), num1(n1) {} // 错误的初始化顺序
};
上述代码中,尽管在初始化列表中 num2
先于 num1
,但实际的初始化顺序仍然是先 num1
再 num2
,这可能导致意外的结果。
四、复杂类型的初始化
- C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的
成员使⽤的。
#include<iostream>
using namespace std;
class Time
{
public:
Time(int hour)
:_hour(hour)
{
cout << "Time()" << endl;
}
private:
int _hour;
};
class Date
{
public:
Date()
:_month(2)
{
cout << "Date()" << endl;
}
oid Print() const
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
// 注意这⾥不是初始化,这⾥给的是缺省值,这个缺省值是给初始化列表的
// 如果初始化列表没有显⽰初始化,默认就会⽤这个缺省值初始化
int _year = 1;
int _month = 1;
int _day;
Time _t = 1;
const int _n = 1;
int* _ptr = (int*)malloc(12);
};
int main()
{
Date d1;
d1.Print();
return 0;
}
对于类类型的成员变量,如果其类有自定义的构造函数,也可以在初始化列表中调用相应的构造函数进行初始化,引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始
化,否则会编译报错。
class InnerClass {
public:
InnerClass(int value) {}
};
class OuterClass {
InnerClass inner;
public:
OuterClass() : inner(42) {}
};
初始化列表为 C++提供了一种更清晰、高效和灵活的成员变量初始化方式。正确使用初始化列表可以避免一些潜在的错误,提高代码的性能和可读性。
希望通过这篇博客,您对 C++的初始化列表有了更深入的理解和认识。如果您有任何疑问或想法,欢迎在评论区交流分享!