C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看。

【default关键字】
首先我们有一个字符串类:

  1. class CString
  2. {
  3. char* _str;
  4. public:
  5. //构造函数
  6. CString(const char* pstr) : _str(nullptr)
  7. {
  8. UpdateString(pstr);
  9. }
  10. //析构函数
  11. ~CString()
  12. {
  13. if (_str)
  14. free(_str);
  15. }
  16. public:
  17. void UpdateString(const char* pstr) throw()
  18. {
  19. if (pstr == nullptr)
  20. return;
  21. if (_str)
  22. free(_str);
  23. _str = (char*)malloc(strlen(pstr) + 1);
  24. strcpy(_str,pstr);
  25. }
  26. public:
  27. char* GetStr() const throw()
  28. {
  29. return _str;
  30. }
  31. };

我们可以这样使用:

  1. auto str = std::make_unique<CString>("123");
  2. printf(str->GetStr());

但是这样是不行的:

  1. auto str = std::make_unique<CString>(); //失败,因为没有一个无参构造函数

好,我们用default来:

  1. class CString
  2. {
  3. char* _str = nullptr;
  4. public:
  5. CString() = default;
  6. public:
  7. //构造函数
  8. CString(const char* pstr) : _str(nullptr)
  9. {
  10. UpdateString(pstr);
  11. }
  12. //析构函数
  13. ~CString()
  14. {
  15. if (_str)
  16. free(_str);
  17. }
  18. public:
  19. void UpdateString(const char* pstr) throw()
  20. {
  21. if (pstr == nullptr)
  22. return;
  23. if (_str)
  24. free(_str);
  25. _str = (char*)malloc(strlen(pstr) + 1);
  26. strcpy(_str,pstr);
  27. }
  28. public:
  29. char* GetStr() const throw()
  30. {
  31. return _str;
  32. }
  33. };

于是我们可以这样使用了:

  1. auto str_def = std::make_unique<CString>();
  2. str_def->UpdateString(“123”);
  3. printf(str_def->GetStr() == nullptr ? "None":str_def->GetStr());

【delete关键字】
假设我们有这样一个类,这个类是用于自动申请内存,进行RAII式管理:
(避免麻烦那些什么拷贝构造拷贝赋值移动构造什么的就不写了)

  1. template<typename T>
  2. class CStackMemoryAlloctor
  3. {
  4. mutable T* _ptr;
  5. public:
  6. explicit CStackMemoryAlloctor(size_t size) throw() : _ptr(nullptr)
  7. {
  8. _ptr = (T*)malloc(size);
  9. }
  10. ~CStackMemoryAlloctor()
  11. {
  12. if (_ptr)
  13. free(_ptr);
  14. }
  15. public:
  16. operator T*() const throw()
  17. {
  18. T* tmp = _ptr;
  19. _ptr = nullptr;
  20. return tmp;
  21. }
  22. public:
  23. T* GetPtr() const throw()
  24. {
  25. return _ptr;
  26. }
  27. };

我们这样使用这个类:

  1. CStackMemoryAlloctor<wchar_t> str(128);
  2. wchar_t* pstr = str.GetPtr();
  3. wcscpy(pstr,L"123\n");
  4. wprintf(pstr);

但是别人也可以这样使用:

  1. auto p = std::make_unique<CStackMemoryAlloctor<wchar_t>>(128);

因为这个类依然可以进行默认new,我们不想让人家进行new怎么办,老办法就是这样:

  1. private:
  2. void* operator new(std::size_t)
  3. {
  4. return nullptr;
  5. }

把new设置为private了,就行了,但是这样如果别人尝试new,那看到的错误提示简直惨不忍睹。。。
于是C11的delete人性化多了:

  1. public:
  2. void* operator new(std::size_t) = delete;

当尝试new的时候,提示十分友好,这个方法已被删除。
这个delete可以用来删任何你不爽的东西,比如拷贝构造,赋值拷贝什么鸡巴毛的东西。

原文转自:http://blog.csdn.net/a1875566250/article/details/40406883

原作者为 a1875566250. 请尊重原作者版权

C++11的default和delete关键字的更多相关文章

  1. c++11 类默认函数的控制:"=default" 和 "=delete"函数

    c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...

  2. c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;

    转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...

  3. c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...

  4. C++ default 和delete的新用法

    C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...

  5. C++中 =default 和 =delete 使用

    编译器默认为一个类生成的默认函数 默认构造函数 默认析构函数 默认拷贝构造函数 默认赋值函数 移动构造函数 移动拷贝函数 class DataOnly { public: DataOnly () // ...

  6. 【译】ASP.NET MVC 5 教程 - 11:Details 和 Delete 方法详解

    原文:[译]ASP.NET MVC 5 教程 - 11:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details ...

  7. 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)

    本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...

  8. 在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)

    原文:在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  9. default和delete

    在C++中,有四类特殊的成员函数,分别为:默认构造函数,默认析构函数,默认拷贝构造函数,默认赋值运算符.他们的作用为创建.初始化.销毁.拷贝对象. 虽然在类A中什么都没有定义,但是编译会通得过,因为编 ...

随机推荐

  1. eclipse 设置书签标记(标签-Bookmark

    在代码的左边灰色区右键单击,有个“Add Bookmark”,点击后输入书签名,会出现一个蓝色的书签标记 在这个书签标记上右键单击,有个“Remove Bookmark”,点击删除标签 菜单:wind ...

  2. windows下制作linux U盘启动盘或者安装优盘(转)

    windows下制作linux U盘启动盘或者安装优盘(转) Linux发行版排行榜:http://iso.linuxquestions.org/ [方案一]:UltraISO(不推荐,在Window ...

  3. Windows 10 L2TP 809错误

    今天不知道为什么,一直工作正常的L2TP不能连接了.我用的是Surface Pro 3,Windows 10 专业版,操作系统一直保持自动更新,而且最近也没有安装什么软件.点击连接后,等一段时间就报8 ...

  4. 【转载】SweetAlert2 使用

    SweetAlert2是一款功能强大的纯Js模态消息对话框插件.SweetAlert2用于替代浏览器默认的弹出对话框,它提供各种参数和方法,支持嵌入图片,背景,HTML标签等,并提供5种内置的情景类, ...

  5. 为什么 Java 不提供无符号类型呢?

    网上查资料,无意中找到一个java写的开源论坛,用的人还挺多 http://jforum.net/ 查MD5,了解到 Java getBytes方法详解(字符集问题) http://liushilan ...

  6. 代码覆盖率工具 EMMA

    使用 EMMA 获得功能测试覆盖率 测试覆盖率是评价测试完整性的重要的度量标准之一. EMMA 是一个面向 Java 代码的测试覆盖率收集工具.在测试过程中,使用 EMMA 能使收集和报告测试覆盖率的 ...

  7. Thinkphp大纲——基础参考

    一.ThinkPHP核心文件介绍 ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend 框架扩展目录 ├─Lang 核心语言包目录 ...

  8. 关于maya动力学系统的一些总结

    maya动力学有以下几套系统: 1.刚体.柔体系统 刚体系统的典型节点连接方法如下: 物体的变换节点.形状节点连接rigidBody节点,刚体节点输出力到解算器节点,解算器输出新的变换到变换节点 值得 ...

  9. NOIP2015 Revenge

    辣鸡出题人,毁我比赛,颓我精神,耗我钱财,废我青春. 去年成绩惨不忍睹就不说了...好像是100+80+0+100+50+60. 大概列一下算法. 幻方:模拟 #include <iostrea ...

  10. Docker简明教程(以安装wget程序为例)

    本文计划: 一.安装Docker(Centos) 二.注册Docker官网帐号 三.下载基础centos镜像,安装需要的软件和环境后,push到自己的repository 一.安装Docker(Cen ...