📜  C++ 11中的显式默认和删除函数(1)

📅  最后修改于: 2023-12-03 15:29:49.064000             🧑  作者: Mango

C++ 11中的显式默认和删除函数

C++ 11引入了显式默认和删除函数的概念,这是一种更加清晰地定义函数的方法。我们可以通过显式指定默认和删除函数来避免一些不必要的错误,使得代码更加安全和可读。在本文中,我们将介绍默认和删除函数的用法并举例说明。

显式默认函数

默认函数是指编译器会自动生成的函数,我们在定义类时可以不显式地定义它们。常见的默认函数包括默认构造函数、复制构造函数、拷贝赋值操作符和析构函数等。

在C++ 11中,我们可以用default关键字显式指示编译器生成默认函数,这样可以使得代码更加明确。下面是一个例子:

class Person {
public:
    Person() = default; // 显式指示编译器生成默认构造函数
    Person(const Person&) = default; // 显式指示编译器生成复制构造函数
    Person& operator=(const Person&) = default; // 显式指示编译器生成拷贝赋值操作符
    ~Person() = default; // 显式指示编译器生成析构函数
};

上面的代码中,我们通过显式指示编译器生成了Person的默认构造函数、复制构造函数、拷贝赋值操作符和析构函数。

需要注意的是,如果我们想要指示编译器生成默认构造函数或析构函数,而我们又在类中显式定义了其他构造函数或析构函数,那么就必须在这些函数的参数列表最后加上=default。这是因为在C++ 11中规定,如果类中定义了任意一个构造函数或析构函数,那么编译器将不再生成默认构造函数或析构函数。

显式删除函数

删除函数是指编译器会阻止使用的函数,我们在定义类时可以通过删除函数来避免一些错误。常见的删除函数包括禁止复制的复制构造函数、禁止赋值的赋值操作符等。

在C++ 11中,我们可以用delete关键字显式指定一个函数为删除函数,这样可以强制编译器禁止使用该函数。下面是一个例子:

class Person {
public:
    Person(const Person&) = delete; // 显式禁止复制构造函数
    Person& operator=(const Person&) = delete; // 显式禁止赋值操作符
};

上面的代码中,我们通过显式指定Person的复制构造函数和赋值操作符为删除函数,可以在编译时阻止这些操作的使用。

需要注意的是,我们不能删除构造函数或析构函数,因为它们在对象的生命周期中扮演了重要的角色。

总结

通过使用显式默认和删除函数,可以使得代码更加明确和安全。我们应该在实践中充分利用这种语言特性,编写更加清晰和易于维护的代码。