Copy-and-swap
2015-12-23 11:06
211 查看
为了在自己定义类里重载一个异常安全(exception safe)的赋值操作符。创造了一个这种习惯用语。也叫:Create-Temporary-and-Swap。
要想写健壮的C++代码。异常安全很重要。
能够给异常安全分三级:
1> 基本安全:实现简单、代价小。应该作为常规手段。
2> 非常安全:在不论什么场合都实现这一步不太可能。本例的赋值操作符重载算是一个。
3> 不抛出异常:能够看non-throwing swap。
所谓“Create-Temporary-and-Swap”。就是先申请新资源。用后再释放。
1> 在申请新资源的时候,要使用RAII原则。
2> 申请成功之后。使用non-throwing swap原则交换资源。
[cpp] view plaincopy
class String {
char * str;
public:
String& operator = (String const &s)
{
String temp (s); // copy-constructor -- RAII
temp.swap (*this); // non-throwing swap
return *this;
}
void swap (String &s) throw ()
{
std::swap(this->str, s.str);
}
};
有时会增加对參数的推断:
[cpp] view plaincopy
class String {
char * str;
public:
String& operator = (String const &s)
{
if (this != &s)
String(s).swap (*this); // copy-constructor and non-throwing swap
return *this;
}
void swap (String &s) throw ()
{
std::swap(this->str, s.str);
}
};
在函数内部的暂时变量。事实上能够省略。仅仅要用传值的方式:
[cpp] view plaincopy
String& operator = (String s) // pass-by-value
{
s.swap (*this); // Non-throwing swap
return *this;
}
这样的作法在某些情况下能够得到优化。
假设s绑定到lvalue,无优化。栈内会有暂时对象被创建;假设绑定到rvalue。一般就会省略掉copy ctor的调用。
[cpp] view plaincopy
String createString(); // a function that returns a String object.
String s;
s = createString(); // 这是rvalue的一例。使用传值的赋值操作符。可得到优化
在C++0x标准中,这种赋值操作符叫做“统一赋值操作符”,由于它合“拷贝赋值”、“移动赋值”为一体了。C++0x编译器一旦发现某个类有move ctor存在,总会对暂时的rvalue进行优化的。
老编译器当然没有move ctor,可是能对赋值操作进行rvalue的优化,也算是有的一比。
要想写健壮的C++代码。异常安全很重要。
能够给异常安全分三级:
1> 基本安全:实现简单、代价小。应该作为常规手段。
2> 非常安全:在不论什么场合都实现这一步不太可能。本例的赋值操作符重载算是一个。
3> 不抛出异常:能够看non-throwing swap。
所谓“Create-Temporary-and-Swap”。就是先申请新资源。用后再释放。
1> 在申请新资源的时候,要使用RAII原则。
2> 申请成功之后。使用non-throwing swap原则交换资源。
[cpp] view plaincopy
class String {
char * str;
public:
String& operator = (String const &s)
{
String temp (s); // copy-constructor -- RAII
temp.swap (*this); // non-throwing swap
return *this;
}
void swap (String &s) throw ()
{
std::swap(this->str, s.str);
}
};
有时会增加对參数的推断:
[cpp] view plaincopy
class String {
char * str;
public:
String& operator = (String const &s)
{
if (this != &s)
String(s).swap (*this); // copy-constructor and non-throwing swap
return *this;
}
void swap (String &s) throw ()
{
std::swap(this->str, s.str);
}
};
在函数内部的暂时变量。事实上能够省略。仅仅要用传值的方式:
[cpp] view plaincopy
String& operator = (String s) // pass-by-value
{
s.swap (*this); // Non-throwing swap
return *this;
}
这样的作法在某些情况下能够得到优化。
假设s绑定到lvalue,无优化。栈内会有暂时对象被创建;假设绑定到rvalue。一般就会省略掉copy ctor的调用。
[cpp] view plaincopy
String createString(); // a function that returns a String object.
String s;
s = createString(); // 这是rvalue的一例。使用传值的赋值操作符。可得到优化
在C++0x标准中,这种赋值操作符叫做“统一赋值操作符”,由于它合“拷贝赋值”、“移动赋值”为一体了。C++0x编译器一旦发现某个类有move ctor存在,总会对暂时的rvalue进行优化的。
老编译器当然没有move ctor,可是能对赋值操作进行rvalue的优化,也算是有的一比。
相关文章推荐
- Linux的文件类型
- 底层文件操作函数--open、close、write、read
- nginx 外网代理
- 在浏览器的标签页显示网站标志图标(或指定图标)的方法
- .bash_profile和.bashrc的区别(如何设置生效)
- CentOS安装FTP及配置用户
- Linux删除原理
- shell--test用法
- AOP VS Decorator
- Centos7安装完毕后无法联网的解决方法
- TOMCAT应用部署
- linux进程间的通信: 信号量
- 快速熟悉shell
- centos批量修改文件名
- linux进程间的通信: 消息队列
- ubuntu 15.10 nginx rtmp 搭建
- OpenLDAP安装与配置
- linux进程间的通信: 共享内存
- 使用ISO文件安装Linux
- Apache禁止目录访问方法介绍