构造函数与析构函数
在 C++ 中,构造函数和析构函数是类的一部分,分别用于初始化和清理对象。它们在对象的生命周期管理中扮演着关键角色。
1. 构造函数
构造函数(Constructor)是一个特殊的成员函数,在对象创建时自动调用,用于初始化对象。构造函数的名称与类名相同,并且没有返回类型。
1.1 默认构造函数
默认构造函数没有参数,如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数。
#include <iostream>
class Example {
public:
Example() {
std::cout << "Default Constructor called" << std::endl;
}
};
int main() {
Example obj;
return 0;
}
1.2 参数化构造函数
参数化构造函数接受参数,可以根据提供的值来初始化对象。
#include <iostream>
class Example {
public:
int value;
Example(int v) : value(v) {
std::cout << "Parameterized Constructor called with value: " << value << std::endl;
}
};
int main() {
Example obj(42);
return 0;
}
1.3 拷贝构造函数
拷贝构造函数用于创建一个新对象,该对象是现有对象的副本。它接受现有对象的引用作为参数。
#include <iostream>
class Example {
public:
int value;
Example(int v) : value(v) {}
Example(const Example& other) : value(other.value) {
std::cout << "Copy Constructor called" << std::endl;
}
};
int main() {
Example obj1(42);
Example obj2 = obj1;
return 0;
}
1.4 移动构造函数
移动构造函数用于实现资源的转移,从而避免不必要的拷贝操作。它接受一个右值引用作为参数。
#include <iostream>
#include <utility>
class Example {
public:
int* data;
Example(int value) : data(new int(value)) {}
Example(Example&& other) noexcept : data(other.data) {
other.data = nullptr;
std::cout << "Move Constructor called" << std::endl;
}
~Example() {
delete data;
}
};
int main() {
Example obj1(42);
Example obj2 = std::move(obj1);
return 0;
}
2. 析构函数
析构函数(Destructor)是一个特殊的成员函数,在对象销毁时自动调用,用于释放资源。析构函数的名称与类名相同,前面加上 ~
,并且没有参数和返回类型。
#include <iostream>
class Example {
public:
Example() {
std::cout << "Constructor called" << std::endl;
}
~Example() {
std::cout << "Destructor called" << std::endl;
}
};
int main() {
Example obj;
return 0;
}
3. 构造函数与析构函数的调用顺序
构造函数与析构函数的调用顺序遵循以下规则:
- 构造函数按照声明顺序初始化成员变量。
- 析构函数按照与构造函数相反的顺序销毁成员变量。
- 基类构造函数在派生类构造函数之前调用。
- 基类析构函数在派生类析构函数之后调用。
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base Constructor called" << std::endl;
}
~Base() {
std::cout << "Base Destructor called" << std::endl;
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived Constructor called" << std::endl;
}
~Derived() {
std::cout << "Derived Destructor called" << std::endl;
}
};
int main() {
Derived obj;
return 0;
}
4. 总结
构造函数和析构函数是 C++ 类中用于管理对象生命周期的核心机制。通过理解和正确使用这些函数,程序员可以确保对象在创建和销毁过程中正确地初始化和清理资源,从而提高程序的稳定性和性能。