打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
C++11的default和delete关键字
honeyeyo
>《待分类》
2016.07.07
关注
C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看。
【default关键字】
首先我们有一个字符串类:
[cpp]
view plain
copy
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;
}
};
我们可以这样使用:
[cpp]
view plain
copy
auto str = std::make_unique<CString>("123");
printf(str->GetStr());
但是这样是不行的:
[cpp]
view plain
copy
auto str = std::make_unique<CString>(); //失败,因为没有一个无参构造函数
好,我们用default来:
[cpp]
view plain
copy
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;
}
};
于是我们可以这样使用了:
[cpp]
view plain
copy
auto str_def = std::make_unique<CString>();
str_def->UpdateString(“123”);
printf(str_def->GetStr() == nullptr ? "None":str_def->GetStr());
【delete关键字】
假设我们有这样一个类,这个类是用于自动申请内存,进行RAII式管理:
(避免麻烦那些什么拷贝构造拷贝赋值移动构造什么的就不写了)
[cpp]
view plain
copy
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;
}
};
我们这样使用这个类:
[cpp]
view plain
copy
CStackMemoryAlloctor<wchar_t> str(128);
wchar_t* pstr = str.GetPtr();
wcscpy(pstr,L"123\n");
wprintf(pstr);
但是别人也可以这样使用:
[cpp]
view plain
copy
auto p = std::make_unique<CStackMemoryAlloctor<wchar_t>>(128);
因为这个类依然可以进行默认new,我们不想让人家进行new怎么办,老办法就是这样:
[cpp]
view plain
copy
private:
void* operator new(std::size_t)
{
return nullptr;
}
把new设置为private了,就行了,但是这样如果别人尝试new,那看到的错误提示简直惨不忍睹。。。
于是C11的delete人性化多了:
[cpp]
view plain
copy
public:
void* operator new(std::size_t) = delete;
当尝试new的时候,提示十分友好,这个方法已被删除。
这个delete可以用来删任何你不爽的东西,比如拷贝构造,赋值拷贝什么鸡巴毛的东西。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
VC2010中将CString转换为const char*
C++赋值运算符、函数调用运算符、下标运算符(“=”、“()”、“[]”)重载
【整理】Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、...
03选择题: C++内存重叠 拷贝
char * 与 string 类型相互转换方法
利用CString和CStringA方便地进行UNICODE字符串和ANSI字符串的转换
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×