谈谈C++11中的默认和删除函数(defaulted and deleted functions)及其用途。
在C++11中,引入了默认函数(defaulted functions)和删除函数(deleted functions)的概念,以提供对特殊成员函数(如构造函数、析构函数、赋值运算符等)的更精细控制。
默认函数:
- 使用
= default;
语法可以显式地指示编译器生成特殊成员函数的默认实现。 - 这对于保持类的可复制性或可移动性同时保持代码简洁非常有用。
class MyClass {
public:
MyClass() = default; // 默认构造函数
MyClass(const MyClass&) = default; // 默认拷贝构造函数
MyClass& operator=(const MyClass&) = default; // 默认拷贝赋值运算符
~MyClass() = default; // 默认析构函数
};
删除函数:
- 使用
= delete;
语法可以显式地禁止特定函数的使用。 - 这对于防止对象的拷贝或赋值、禁止某些类型的参数重载等场景非常有用。
class NonCopyable {
public:
NonCopyable(const NonCopyable&) = delete; // 禁止拷贝构造
NonCopyable& operator=(const NonCopyable&) = delete; // 禁止拷贝赋值
};
void func(int) {
// ...
}
void func(double) = delete; // 禁止使用double类型的参数调用func
用途:
- 保持特殊成员函数的默认行为: 使用
= default;
可以保留编译器自动生成的特殊成员函数的默认行为,同时保持代码的清晰和简洁。 - 禁止类的拷贝或赋值: 通过将拷贝构造函数和拷贝赋值运算符设置为删除,可以防止类的实例被拷贝或赋值。
- 禁止某些函数重载: 使用
= delete;
可以禁止特定参数类型的函数重载,从而避免潜在的错误或歧义。
总结:
默认和删除函数是C++11中的重要特性,它们提供了对类特殊成员函数行为的更精细控制。通过使用这些特性,可以显式地指定哪些函数应该被默认实现、哪些函数应该被禁用,从而增强代码的可读性、安全性和灵活性。