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. 并且给出了行号, 错误原因一目了然.&nb

本文介绍了C++11中使用`delete`关键字禁用拷贝构造函数和赋值运算符的功能,通过示例展示了如何配合宏`NonCopyable(ClassName)`使用,以及`delete`相较于传统private方式的优势。同时,讨论了宏实现NonCopyable时遇到的问题及解决方案,最终提出使用`delete`关键字的NonCopyable宏,以实现更灵活的不可复制类设计。
最低0.47元/天 解锁文章
1080





