[作者的个人Gitee>](友人A (friend-a188881041351) - Gitee.com)
每日一言:“**存在是一场无尽的对话,我们既是提问者,也是答案。”
在C++中,构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的状态。它与类同名,没有返回值(包括void
)。构造函数在对象生命周期的开始阶段被调用,确保对象在使用之前处于一个有效的状态。
class ClassName {
public:
ClassName(); // 默认构造函数
ClassName(int param); // 带参数的构造函数
};
初始化列表用于在构造函数中初始化成员变量,尤其是那些没有默认构造函数的成员变量(如常量成员、引用成员等)。
语法:
class MyClass {
public:
int a;
const int b;
MyClass(int x, int y) : a(x), b(y) { } // 初始化列表
};
初始化列表的顺序是按照成员变量在类声明中的顺序,而不是初始化列表中写的顺序。因此,初始化列表的顺序最好与成员变量声明的顺序一致,以避免混淆。
类可以定义多个构造函数,只要其参数列表不同(参数类型、参数个数或参数顺序不同)。
示例:
class MyClass {
public:
MyClass() { } // 默认构造函数
MyClass(int a) { } // 带一个参数的构造函数
MyClass(int a, int b) { } // 带两个参数的构造函数
};
拷贝构造函数是一种特殊的构造函数,编译器会自动生成一个默认的拷贝构造函数,他会逐成员复制对象的内容。
注意:如果类中包含指针或动态分配的资源,需要自定义拷贝构造函数以避免浅拷贝的问题(多个对象共享同一资源)。
示例:
class MyClass {
public:
MyClass(const MyClass& other) {
data = new int[10];
std::copy(other.data, other.data + 10, data);
}
private:
int* data;
};
public
、protected
或private
。private
,则无法直接通过new
或对象声明来创建对象,通常用于实现单例模式或限制对象的创建方式。class MyClass {
public:
~MyClass() { // 析构函数
// 清理资源的代码
}
};
析构函数可以被自动调用,也可以显式调用(但不推荐显式调用)。
delete
时,析构函数会被调用。资源释放
在析构函数中,确保释放所有动态分配的资源,避免内存泄漏。
如果类中包含指针成员变量,需要在析构函数中使用delete
或delete[]
释放内存。
class MyClass {
public:
~MyClass() {
delete[] data; // 释放动态分配的内存
}
private:
int* data;
};
如果对象被多次析构(例如,同一个指针被多次delete
),可能会导致程序崩溃。
确保析构函数只被调用一次,或者在析构函数中将指针置为nullptr
,以避免多次释放。
~MyClass() {
delete[] data;
data = nullptr; // 防止多次释放
}
如果类不需要拷贝操作,可以通过将拷贝构造函数和拷贝赋值运算符声明为private
,并定义一个空的析构函数。
这样可以防止类对象被拷贝,同时确保析构函数的正确性。
class NonCopyable {
public:
NonCopyable() { }
~NonCopyable() { }
private:
NonCopyable(const NonCopyable&);
NonCopyable& operator=(const NonCopyable&);
};
如有错误,恳请指正。