谈谈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

用途:

  1. 保持特殊成员函数的默认行为: 使用 = default; 可以保留编译器自动生成的特殊成员函数的默认行为,同时保持代码的清晰和简洁。
  2. 禁止类的拷贝或赋值: 通过将拷贝构造函数和拷贝赋值运算符设置为删除,可以防止类的实例被拷贝或赋值。
  3. 禁止某些函数重载: 使用 = delete; 可以禁止特定参数类型的函数重载,从而避免潜在的错误或歧义。

总结:
默认和删除函数是C++11中的重要特性,它们提供了对类特殊成员函数行为的更精细控制。通过使用这些特性,可以显式地指定哪些函数应该被默认实现、哪些函数应该被禁用,从而增强代码的可读性、安全性和灵活性。

发表评论

后才能评论