C++ defaulted 学习笔记
1. 简介
- 作用:defaulted 关键字用于声明编译器生成的默认函数,如默认构造函数、拷贝构造函数、赋值运算符等。
- 优势:通过使用 defaulted 关键字,可以明确指示编译器生成默认函数,减少了重复的代码编写。
- 发展历程:C++11 引入了 defaulted 关键字,用于替代传统的手动定义默认函数的方式。
示例代码:
#include <iostream>
class MyClass {
public:
// 默认构造函数
MyClass() = default;
// 拷贝构造函数
MyClass(const MyClass&) = default;
// 赋值运算符
MyClass& operator=(const MyClass&) = default;
// 析构函数
~MyClass() = default;
};
int main() {
MyClass obj; // 调用默认构造函数
MyClass obj2 = obj; // 调用默认拷贝构造函数
return 0;
}
2. 应用场景
- 默认函数:用于声明默认构造函数、拷贝构造函数、赋值运算符等。
- 删除函数:结合 deleted 关键字,可以用于删除特定的函数,禁止其使用。
- 覆盖:在派生类中,用于覆盖基类中的默认函数,可以明确指示编译器生成默认函数。
示例代码:
#include <iostream>
class Base {
public:
// 默认析构函数
virtual ~Base() = default;
};
class Derived : public Base {
public:
// 覆盖默认析构函数
~Derived() override = default;
};
int main() {
Base* ptr = new Derived(); // 动态分配 Derived 对象
delete ptr; // 调用默认析构函数
return 0;
}
3. 使用技巧
- 结合 deleted 关键字:结合 deleted 关键字,可以实现删除函数的效果,禁止某些函数的使用。
- 继承关系:在继承关系中,可以通过 defaulted 关键字明确默认函数的生成,提高了代码的清晰度。
- 与自定义函数结合:可以与自定义函数结合使用,例如自定义析构函数等。
示例代码:
#include <iostream>
class NoCopy {
public:
// 禁止拷贝构造函数
NoCopy(const NoCopy&) = delete;
// 禁止赋值运算符
NoCopy& operator=(const NoCopy&) = delete;
};
int main() {
NoCopy obj1;
NoCopy obj2 = obj1; // 编译错误,禁止拷贝构造函数
return 0;
}
4. 实战案例分析
- 默认函数的应用:在类中使用 defaulted 关键字声明默认函数,减少重复的代码。
- 删除函数的应用:结合 deleted 关键字,禁止某些函数的使用,提高代码的安全性。
- 覆盖默认函数:在派生类中使用 defaulted 关键字覆盖基类中的默认函数,保持继承关系的一致性。
通过学习 defaulted 关键字,可以更好地管理类中的默认函数,提高代码的可读性和可维护性。