C++ - 构造函数初始化列表
在实例化对象时,构造函数通常会处理成员变量的初始化。对于此类成员,构造函数的初始化列表提供了一种在构造函数主体执行之前进行初始化的简洁高效的方法。除了性能之外,有时由于 const 变量或基类成员的存在,初始化列表也是必需的。
什么是构造函数初始化列表?
构造函数初始化列表是直接初始化成员变量的过程,因此不存在复制后赋值的默认构造函数。
语法
构造函数列表初始化的语法如下:
ClassName(type1 param1, type2 param2) : member1(param1), member2(param2) { // 构造函数主体 }
此处,member1 和 member2 在构造函数主体运行之前使用 param1 和 param2 进行初始化。
构造函数初始化列表示例
这是一个简单示例,演示如何使用初始化列表。
#include <iostream> #include <string> class Student { public: Student(const std::string& name, int age) : name(name), age(age) {} void display() const { std::cout << "Name: " << name << ", Age: " << age << ""; } private: std::string name; int age; }; int main() { Student s("Navya", 20); s.display(); return 0; }
输出
Name: Navya, Age: 20
为什么使用构造函数初始化列表?
- 避免默认初始化后再进行重新赋值,从而节省时间和资源。
- 对于某些类型的 const 变量、引用成员和基类成员,它是必需的。
- 它将所有初始化逻辑集中在一个地方,与构造函数主体分开。
特殊情况
接下来,我们将讨论构造函数初始化列表的一些特殊情况 -
Const 或引用成员
Const 变量和引用成员无法重新赋值,因此必须在初始化列表中初始化它们。
class Config { public: Config(const std::string& product, const int & model) : product (product), model(model) {} private: const std::string product; const int & model; };
基类初始化
当派生类继承自基类时,可以使用初始化列表调用基类构造函数。
class Base { public: Base(int value) : baseValue(value) {} protected: int baseValue; }; class Derived : public Base { public: Derived(int value, int extra) : Base(value), extraValue(extra) {} private: int extraValue; };