1. 构造函数与析构函数的核心概念
在C++面向对象编程中,构造函数和析构函数是类设计中最为基础也最为关键的成员函数。它们就像建筑物的地基和拆除队,一个负责对象的诞生,一个负责对象的消亡。构造函数在对象创建时自动调用,用于初始化对象状态;析构函数在对象生命周期结束时自动调用,用于清理资源。
我见过太多新手程序员忽视这两个函数的正确使用,导致内存泄漏、资源未释放等问题。实际上,理解它们的运作机制是写出健壮C++代码的第一步。构造函数和析构函数的调用时机由编译器严格保证,这种确定性是C++区别于其他语言的重要特征。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 构造函数的类型与使用场景
2.1 默认构造函数
默认构造函数是不带任何参数的构造函数,当用户没有显式定义任何构造函数时,编译器会自动生成一个。但这里有个坑:一旦你定义了任何构造函数,编译器就不再提供默认版本。这在容器类使用时会导致编译错误:
cpp复制class MyClass {
public:
MyClass(int x) {} // 自定义构造函数
};
std::vector<MyClass> vec(10); // 错误!找不到MyClass::MyClass()
提示:如果类需要放入标准容器,务必确保它有可访问的默认构造函数。
2.2 参数化构造函数
带参数的构造函数允许在创建对象时初始化成员变量。现代C++推荐使用成员初始化列表:
cpp复制class Person {
std::string name;
int age;
public:
Person(const std::string& n, int a) : name(n), age(a) {}
// 比在函数体内赋值效率更高
};
2.3 拷贝构造函数
拷贝构造函数控制对象如何被拷贝。当心浅拷贝问题!特别是当类包含指针成员时:
cpp复制class String {
char* data;
public:
String(const String& other) {
data = new char[strlen(other.data) + 1];
strcpy(data, other.data); //
