构造函数:对象的初始化
构造函数是一种特殊的成员函数,其名称与类名相同,没有返回类型(甚至没有 void)。它的主要作用是在创建类的对象时自动初始化对象的状态。
特点:
- 与类名相同。
- 没有返回类型。
- 在对象创建时自动调用。
- 可以有多个重载的构造函数(参数列表不同)。
分类:
- 默认构造函数: 没有参数的构造函数。如果类中没有显式定义构造函数,编译器会自动生成一个默认构造函数。
- 参数化构造函数: 带有参数的构造函数,允许在创建对象时传递初始值。
- 拷贝构造函数: 以同类型的另一个对象作为参数的构造函数,用于创建对象的副本(将在后续课程中详细介绍)。
代码示例(包含默认构造函数和参数化构造函数):
#include <iostream>
#include <string>
class Cat {
public:
std::string name;
int age;
// 默认构造函数
Cat() : name("Unknown"), age(0) {
std::cout << "一只未命名的小猫被创建了。" << std::endl;
}
// 参数化构造函数
Cat(const std::string& catName, int catAge) : name(catName), age(catAge) {
std::cout << "小猫 " << name << " 被创建了!" << std::endl;
}
void meow() const {
std::cout << "喵!我是 " << name << ", " << age << " 岁了!" << std::endl;
}
};
int main() {
Cat cat1; // 调用默认构造函数
cat1.meow();
Cat cat2("Tom", 2); // 调用参数化构造函数
cat2.meow();
return 0;
}
析构函数:对象的清理
析构函数也是一种特殊的成员函数,其名称与类名相同,并在前面加上波浪号 ~。它没有参数,也没有返回类型。析构函数在对象即将被销毁时自动调用,用于执行清理工作,例如释放对象占用的资源(如动态分配的内存、打开的文件等)。
特点:
- 名称与类名相同,前加
~。 - 没有参数。
- 没有返回类型。
- 在对象生命周期结束时自动调用。
- 一个类只能有一个析构函数。
何时调用析构函数:
- 局部对象在离开其作用域时。
- 动态分配的对象通过
delete删除时。 - 全局对象在程序结束时。
代码示例:
#include <iostream>
class ResourceHolder {
public:
ResourceHolder() {
resource = new int[10];
std::cout << "资源已分配。" << std::endl;
}
~ResourceHolder() {
delete[] resource;
std::cout << "资源已释放。" << std::endl;
}
private:
int* resource;
};
int main() {
{
ResourceHolder holder; // 在此代码块结束时,holder 的析构函数会被调用
}
ResourceHolder* dynamicHolder = new ResourceHolder();
delete dynamicHolder; // 手动删除动态分配的对象,触发析构函数
return 0;
}
构造函数参数初始化列表 4
- 什么是构造函数参数初始化表?
- 构造函数参数初始化表是在构造函数的参数列表和函数体之间,使用冒号
:分隔的代码块。 - 用于初始化成员变量。
- 构造函数参数初始化表是在构造函数的参数列表和函数体之间,使用冒号
- 使用场景
- 初始化常量成员变量。
- 初始化引用类型的成员变量。
- 初始化没有默认构造函数的类类型的成员变量。
- 语法
class MyClass {
public:
int value1;
int value2;
MyClass(int val1, int val2) : value1(val1), value2(val2) {}
};
- 示例代码
class MyClass {
public:
const int value1;
int& value2;
MyClass(int val1, int& val2) : value1(val1), value2(val2) {
//
}
};
int main() {
int x = 10;
MyClass obj(5, x);
return 0;
}