C++11的default和delete关键字
C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看。
【default关键字】
首先我们有一个字符串类:
- class CString
- {
- char* _str;
- public:
- //构造函数
- CString(const char* pstr) : _str(nullptr)
- {
- UpdateString(pstr);
- }
- //析构函数
- ~CString()
- {
- if (_str)
- free(_str);
- }
- public:
- void UpdateString(const char* pstr) throw()
- {
- if (pstr == nullptr)
- return;
- if (_str)
- free(_str);
- _str = (char*)malloc(strlen(pstr) + 1);
- strcpy(_str,pstr);
- }
- public:
- char* GetStr() const throw()
- {
- return _str;
- }
- };
我们可以这样使用:
- auto str = std::make_unique<CString>("123");
- printf(str->GetStr());
但是这样是不行的:
- auto str = std::make_unique<CString>(); //失败,因为没有一个无参构造函数
好,我们用default来:
- class CString
- {
- char* _str = nullptr;
- public:
- CString() = default;
- public:
- //构造函数
- CString(const char* pstr) : _str(nullptr)
- {
- UpdateString(pstr);
- }
- //析构函数
- ~CString()
- {
- if (_str)
- free(_str);
- }
- public:
- void UpdateString(const char* pstr) throw()
- {
- if (pstr == nullptr)
- return;
- if (_str)
- free(_str);
- _str = (char*)malloc(strlen(pstr) + 1);
- strcpy(_str,pstr);
- }
- public:
- char* GetStr() const throw()
- {
- return _str;
- }
- };
于是我们可以这样使用了:
- auto str_def = std::make_unique<CString>();
- str_def->UpdateString(“123”);
- printf(str_def->GetStr() == nullptr ? "None":str_def->GetStr());
【delete关键字】
假设我们有这样一个类,这个类是用于自动申请内存,进行RAII式管理:
(避免麻烦那些什么拷贝构造拷贝赋值移动构造什么的就不写了)
- template<typename T>
- class CStackMemoryAlloctor
- {
- mutable T* _ptr;
- public:
- explicit CStackMemoryAlloctor(size_t size) throw() : _ptr(nullptr)
- {
- _ptr = (T*)malloc(size);
- }
- ~CStackMemoryAlloctor()
- {
- if (_ptr)
- free(_ptr);
- }
- public:
- operator T*() const throw()
- {
- T* tmp = _ptr;
- _ptr = nullptr;
- return tmp;
- }
- public:
- T* GetPtr() const throw()
- {
- return _ptr;
- }
- };
我们这样使用这个类:
- CStackMemoryAlloctor<wchar_t> str(128);
- wchar_t* pstr = str.GetPtr();
- wcscpy(pstr,L"123\n");
- wprintf(pstr);
但是别人也可以这样使用:
- auto p = std::make_unique<CStackMemoryAlloctor<wchar_t>>(128);
因为这个类依然可以进行默认new,我们不想让人家进行new怎么办,老办法就是这样:
- private:
- void* operator new(std::size_t)
- {
- return nullptr;
- }
把new设置为private了,就行了,但是这样如果别人尝试new,那看到的错误提示简直惨不忍睹。。。
于是C11的delete人性化多了:
- public:
- void* operator new(std::size_t) = delete;
当尝试new的时候,提示十分友好,这个方法已被删除。
这个delete可以用来删任何你不爽的东西,比如拷贝构造,赋值拷贝什么鸡巴毛的东西。
原文转自:http://blog.csdn.net/a1875566250/article/details/40406883
原作者为 a1875566250. 请尊重原作者版权
C++11的default和delete关键字的更多相关文章
- c++11 类默认函数的控制:"=default" 和 "=delete"函数
c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;
转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- C++ default 和delete的新用法
C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...
- C++中 =default 和 =delete 使用
编译器默认为一个类生成的默认函数 默认构造函数 默认析构函数 默认拷贝构造函数 默认赋值函数 移动构造函数 移动拷贝函数 class DataOnly { public: DataOnly () // ...
- 【译】ASP.NET MVC 5 教程 - 11:Details 和 Delete 方法详解
原文:[译]ASP.NET MVC 5 教程 - 11:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details ...
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...
- 在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)
原文:在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- default和delete
在C++中,有四类特殊的成员函数,分别为:默认构造函数,默认析构函数,默认拷贝构造函数,默认赋值运算符.他们的作用为创建.初始化.销毁.拷贝对象. 虽然在类A中什么都没有定义,但是编译会通得过,因为编 ...
随机推荐
- C语言中怎么将文件里的数据创建到(读到)链表中?
定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 struct student *next; //next 指针 指向 struct student 类型的变量 ...
- checkbox勾选判断
var xieYi=document.getElementById("xieYi"); if(!xieYi.checked){ alert("请先阅读并勾选购买协议!&q ...
- JavaScript作用域闭包简述
JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...
- Android中分页滑动实现总结
手机的屏幕相对较小,因此会出现当有多项内容需要展示而不得不进行分页的情况.例如手机桌面的应用图标的展示.一般一屏可以显示4*4=16个小方块形的应用程序,可以通过左右滑动进行屏幕的选择.而Androi ...
- Mysql优化系列(1)--Innodb引擎下mysql自身配置优化
1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...
- js删除数据的几种方法
js 删除数组几种方法 var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为u ...
- ES6 数组解构赋值
.数组解构 let [a, b, c,d] = ["aa", "bb", 77,88]; alert(a) //弹出aa 可以用babel 解析看ES5的转换结 ...
- 针对苹果最新审核要求为应用兼容IPv6
在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.为确保现有的应用是兼容的,我们需要注意下面几点. 不建议使用底层的网 ...
- HTML5商城开发一 楼层滚动加载数据
对于楼层加载在以前只是个想法,从来没实现过,刚好项目中碰到,再此总结一下 场景:HTML5,局部商品列表信息滚动(局部滚动条) 1.通过jq设置subCategoryScroll的高度为屏幕显示高度( ...
- HTTP下密码的安全传输、OAuth认证
在复杂的web环境下,我们没有百分的把握保证信息在传输的过程中不被接货,那不是用明文如何告诉服务器自己的身份呢? 在一些高度通信安全的网络中,数据传输会使用HTTPS作为传输协议,但是通常情况下我们没 ...