C++构造函数和析构函数
C++构造函数和析构函数
C++的构造函数和析构函数是类的特殊成员函数,用于对象的创建和销毁,分别在对象的生命周期开始和结束时自动调用。它们的使用对资源管理和对象的初始化/清理至关重要。
1. 构造函数
定义
- 构造函数在对象创建时自动调用,用于初始化对象的数据成员。
- 构造函数的名字与类名相同,没有返回值。
特点
- 无返回值(即使写
void
也会报错)。 - 可以重载:支持多个构造函数,通过参数列表区分。
- 默认构造函数:如果没有定义构造函数,编译器会生成一个默认构造函数。
- 隐式调用与显式调用:构造函数可以通过隐式或显式方式调用。
语法
class MyClass {
public:MyClass() { // 默认构造函数std::cout << "Default Constructor called!" << std::endl;}MyClass(int x) { // 参数化构造函数std::cout << "Parameterized Constructor called with value " << x << std::endl;}
};int main() {MyClass obj1; // 调用默认构造函数MyClass obj2(10); // 调用参数化构造函数MyClass obj3 = MyClass(20); // 显式调用构造函数return 0;
}
类型
- 默认构造函数
- 无参数或所有参数都有默认值。
MyClass() {}
- 参数化构造函数
- 带参数,用于灵活初始化对象。
MyClass(int x, int y) {}
- 拷贝构造函数
- 通过同类型对象初始化新对象,参数是同类的引用。
MyClass(const MyClass& obj) {}
- 移动构造函数
- 用右值引用初始化对象,提升性能。
MyClass(MyClass&& obj) noexcept {}
- 委托构造函数(C++11)
- 一个构造函数调用另一个构造函数。
MyClass() : MyClass(0) {}
初始化列表
构造函数使用初始化列表可以高效地初始化数据成员,特别是常量、引用类型或需要自定义构造的成员。
- 成员变量的初始化顺序与它们在类中声明的顺序一致,而不是在初始化列表中出现的顺序。即使在初始化列表中以不同顺序指定初始化,成员变量的初始化仍按照它们在类中的声明顺序进行。
const
成员变量必须在对象构造时初始化,因为它们一旦初始化后就不能被修改。由于这种特性,const
成员变量的初始化只能通过构造函数的初始化列表
实现,不能在构造函数体内赋值。
class