c++11 中函数声明 新关键字 delete的妙用之一: 搭配宏NonCopyable(ClassName) 使用
编译器版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
1. 首先先来见识一下 c++11 声明中的新关键字 delete
使用如下代码先来试试水.
#include <string>
class Person
{
public:
Person(std::string name) : name_(name) { }
Person(const Person &name) = delete;
private:
std::string name_;
};
int main(int argc, char **argv)
{
Person p1("Crane");
Person p2(p1);
}
首先, 这是一个Person类.借用莱布尼茨一句老掉牙的话: "世界上没有两片完全相同的叶子,也没有性格完全相同的人。"
体现在Person类中, 就是不允许任何两个用户的名字相同, 首先从根源上杜绝: 禁止Person类的拷贝构造函数和赋值运算符.
这里使用 C++11 成员函数声明新特性: = delete, 从逻辑语义上禁止了对于 Person类拷贝构造函数和赋值运算符,
使用g++ 命令编译
g++ -std=c++11 -g -Wall main.cpp -o main
编译错误如下: ( 记得开启 编译器 C++11 支持 )
main.cpp: In function ‘int main(int, char**)’:
main.cpp:37:17: error: use of deleted function ‘Person::Person(const Person&)’
Person p2(p1);
^
main.cpp:26:5: note: declared here
Person(const Person &) = delete;
编译器明确提示了 在main函数中, 使用了 deleted function. 并且给出了行号, 错误原因一目了然. 用户看到这样的错误信息, 很快可以定位到问题所在.
并且注意一点: " = delete "