(1)构造函数
A.What(什么是构造函数)
一种特殊的成员函数:
一方面它没有返回值
另一方面它和类名相同
B.Why(构造函数的作用)
主要作用是创建初始化类对象:为对象的成员赋初始值、执行一些必要的初始化操作等
C. Which(有哪些构造函数)
无参构造函数
如果没有显式定义任何构造函数,编译器将自动生成一个默认构造函数(合成默认构 造函数)。它不带任何参数,并对类的成员进行默认初始化
带参构造函数
参数列表不为空的构造函数
Student(string strStuName, int iAge )
{
m_strStuName = strStuName;
m_iAge = iAge;
}
Student(string strStuName, int iAge = 24)
{
m_strStuName = strStuName;
m_iAge = iAge;
}
拷贝构造函数
将参数中的对象深拷贝给当前对象,如果存在指针数据,一定要重新开辟空间,然后赋值
Student(const Student &stuObj)
{
this->strStuName = stuObj.getName();
this->iAge = stuObj.getAge();
this->ptrScore = new float(strObj.getScore());
}
移动构造函数
实现了数据的转移
Student( Student &stuObj)
{
this->strStuName = stuObj.getName();
stuObj.setName("");
this->iAge = stuObj.getAge();
stuObj.setAge(0);
this->ptrScore = new float(strObj.getScore());
stuObj.score = nullptr;
}
转换构造函数
本质是带一个参数的构造函数,在需要时可以将其他类型的对象隐式转换为当前类的对象
(2)析构函数
A.What(什么是析构函数)
一个特殊的成员函数:
一方面,对象被销毁时自动调用,它不能是delete的
另一方面,和构造函数一样没有返回值
~Student(){
delete this->ptrScore;
ptrScore = nullptr;
}
B.Why(析构函数的作用)
- 可用于释放动态分配的内存
- 可用于关闭文件、数据库连接和网络连接资源
- 解锁互斥量或释放其它同步资源
(3) =default 和 =delete
A.Why
更精确地控制类的成员函数的行为,提高代码的可读性和安全性
B.How
class MyClass {
public:
// 默认构造函数
MyClass() = default; // 默认析构函数
~MyClass() = default; // 禁用拷贝构造函数
MyClass(const MyClass&) = delete; // 禁用赋值运算符
MyClass& operator=(const MyClass&) = delete; // 禁用移动构造函数
MyClass(MyClass&&) = delete; // 使用默认移动赋值运算符
MyClass& operator=(MyClass&&) = default;
};