1. 默认构造函数:对象的"出厂设置"
什么是默认构造函数?
- 没有参数的构造函数
- 当你没有定义任何构造函数时,编译器自动生成
- 用于创建对象时不传递参数的情况
class Smartphone {
public:
// 成员初始化方法一: 函数体内初始化
Smartphone() { // 默认构造函数
storage = 128; // 默认存储容量
brand = "Unknown";
cout << "手机已激活!" << endl;
}
// 成员初始化方法二: 初始化列表
// 默认构造函数使用初始化列表
Smartphone()
: storage(128), // 初始化列表语法
brand("Unknown") // 成员变量直接初始化
{
cout << "手机已激活!" << endl;
}
// 正确版本:带参数构造函数
Smartphone(int storageVal, string brandVal)
: storage(storageVal), // 用参数初始化成员变量
brand(brandVal) // 避免命名冲突
{
cout << "手机已激活!" << endl;
}
private:
int storage;
string brand;
};
// 使用示例
Smartphone myPhone; // 调用默认构造函数
重要特性
- 如果定义了其他构造函数,编译器不再生成默认构造
- 可以强制生成默认构造:
ClassName() = default;
2. 重载构造函数:对象的"定制服务"
为什么需要重载?
- 提供不同的初始化方式
- 适应不同场景的需求
class Pizza {
public:
// 基础款:只指定尺寸
Pizza(int size) : size(size), topping("cheese") {}
// 豪华款:指定尺寸和配料
Pizza(int size, string top) : size(size), topping(top) {}
// 套餐款:包含饮品
Pizza(int size, string top, string drink)
: size(size), topping(top), drink(drink) {}
private:
int size; // 英寸
string topping;
string drink;
};
// 创建不同披萨
Pizza basic(12); // 基础款
Pizza deluxe(14, "pepperoni"); // 豪华款
Pizza combo(16, "veggie", "cola"); // 套餐款
最佳实践
- 使用初始化列表提高效率
- 避免重复代码,可以相互调用
3. 拷贝构造函数:对象的"克隆技术"
核心作用
- 用已有对象创建新对象
- 控制拷贝过程,避免浅拷贝问题
class GameSave {
public:
GameSave(const GameSave& other) {
// 深度拷贝动态内存
data = new int[100];
memcpy(data, other.data, 100*sizeof(int));
cout << "存档已克隆!" << endl;
}
private:
int* data; // 动态分配的存档数据
};
// 使用场景
GameSave original;
GameSave backup(original); // 调用拷贝构造
三大调用时机
- 对象直接赋值初始化
- 函数参数传递对象
- 函数返回对象
4. 赋值运算符:对象的"身份转移"
与拷贝构造的区别
- 作用在已存在的对象
- 使用
=
运算符时触发
class Student {
public:
// 赋值运算符重载
Student& operator=(const Student& other) {
if(this != &other) { // 防止自赋值
age = other.age;
name = other.name;
}
return *this; // 支持链式赋值
}
private:
int age;
string name;
};
// 使用示例
Student a, b;
a = b; // 调用赋值运算符
关键要点
- 必须处理自赋值(a = a)
- 通常返回引用以支持连续赋值
- 与拷贝构造函数配合实现完整拷贝控制
总结对比表
构造函数类型 | 调用时机 | 典型用途 | 示例代码 |
---|---|---|---|
默认构造函数 | 对象无参创建 | 初始化默认值 | MyClass obj; |
重载构造函数 | 带参数创建对象 | 多种初始化方式 | MyClass(42, "X") |
拷贝构造函数 | 对象复制初始化 | 深度拷贝资源 | MyClass obj2(obj1) |
赋值运算符 | 已存在对象赋值 | 资源安全转移 | obj2 = obj1; |
掌握这四类构造函数,就像获得对象创建的"四把钥匙",能让你:
- 控制对象的诞生方式
- 确保资源的正确管理
- 构建更安全高效的C++程序