类的参数列表初始化
1 目标
本文的目的是了解类的参数列表初始化。
2 示例代码
在C++中,类的参数列表初始化(initializer list)是一种初始化成员变量的方式。与在构造函数体内赋值相比,参数列表初始化通常更高效,尤其是当成员变量是对象或常量时。使用参数列表初始化可以避免额外的默认构造和赋值操作,从而提高效率。
2.1 没有使用参数列表初始化的情况
union 在这个例子中,name 和 age 在构造函数体内被赋值。这会导致name先通过默认构造函数初始化,然后再被赋值。
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数在函数体内初始化成员变量
Person(const std::string& n, int a) {
name = n;
age = a;
}
void print() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
Person p("Alice", 30);
p.print();
return 0;
}
2.2 使用参数列表初始化的情况
union在这个例子中,name 和 age 直接在初始化列表中被初始化,避免了不必要的默认构造和赋值操作,提高了效率。
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 使用初始化列表初始化成员变量
Person(const std::string& n, int a) : name(n), age(a) {}
void print() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
Person p("Alice", 30);
p.print();
return 0;
}
3 总结
参数列表初始化的优点
- 效率更高:直接在初始化列表中初始化成员变量可以避免不必要的默认构造和赋值操作。
- 初始化常量成员:常量成员变量(const)和引用(reference)必须在初始化列表中初始化。
- 成员对象的初始化:对于成员对象,使用初始化列表可以避免它们的默认构造和赋值操作。
#include <iostream>
class Example {
private:
const int constantValue; // 常量成员变量
int& referenceValue; // 引用成员变量
public:
// 构造函数使用初始化列表初始化常量和引用成员变量
Example(int constVal, int& refVal)
: constantValue(constVal), referenceValue(refVal) {}
void print() const {
std::cout << "常量值: " << constantValue << ", 引用值: " << referenceValue << std::endl;
}
};
int main() {
int value = 42;
Example example(10, value);
example.print(); // 输出: 常量值: 10, 引用值: 42
// 修改引用的值
value = 100;
example.print(); // 输出: 常量值: 10, 引用值: 100
return 0;
}