C++(构造函数参数列表初始化)
在C++中,构造函数参数列表初始化(initializer list)是一种用于在对象创建时初始化成员变量的语法。这种方式在性能和可读性方面具有一些优势,尤其是当成员变量是类类型或常量时。
1. 构造函数参数列表初始化的语法
构造函数初始化列表以一个冒号(:
)开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号(()
)或大括号({}
)中的初始化式。
class ClassName {
public:
ClassName(int a, int b) : member1(a), member2(b) {
// 构造函数体
}
private:
int member1;
int member2;
};
2. 为什么使用参数列表初始化
-
效率:
-
没使用初始化列表的构造函数,初始化成员变量会先调用默认构造函数,然后再赋值。
而参数列表初始化则避免了这种情况,直接通过初始化列表进行初始化,从而提高了效率。
-
-
常量和引用成员:
const
成员和引用类型的成员(&
)必须在初始化列表中初始化,因为它们不能在构造函数体内赋值。
-
成员类类型:
- 如果成员是一个类类型对象,那么使用初始化列表可以直接调用其构造函数进行初始化,而不是先调用默认构造函数再进行赋值。
3. 示例
#include <iostream>
#include <string>
class Person {
public:
// 构造函数,使用参数列表初始化
Person(const std::string& n, int a) : name(n), age(a) {}
// 显示信息
void displayInfo() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
private:
std::string name;
int age;
};
int main() {
// 创建对象
Person p("Alice", 30);
p.displayInfo();
return 0;
}
Name: Alice, Age: 30
4. 常量和引用成员的示例
#include <iostream>
class Sample {
public:
// 构造函数,使用参数列表初始化
Sample(int a, int b) : ref(a), const_member(b) {}
void displayInfo() {
std::cout << "Reference: " << ref << ", Constant: " << const_member << std::endl;
}
private:
int& ref; // 引用成员
const int const_member; // 常量成员
};
int main() {
int x = 10;
Sample s(x, 20);
s.displayInfo();
return 0;
}
5. 使用参数列表初始化的注意事项
-
初始化顺序:
- 初始化列表中成员的初始化顺序是根据它们在类定义中的声明顺序,而不是在初始化列表中的顺序。需要注意这一点以避免潜在的错误。
-
避免冗余:
- 尽量避免在构造函数体内对已经在初始化列表中初始化过的成员再次进行赋值操作。
6. 总结
构造函数参数列表初始化在C++中是一个非常重要的特性,它提高了代码的效率和可读性,尤其在处理常量、引用成员以及类类型成员时。