C++核心技术:C++惯用法
1 分钟阅读
•
175 字
+
105 词
C++里有个惯用法,可以利用拷贝构造函数和交换函数(swap)来实现赋值运算符,在有了移动构造函数之后,这个惯用法还有一个额外的好处,既可以用一个赋值函数同时完成拷贝赋值和移动赋值两个动作。
//例如,一个string类的赋值运算符可以这样实现:
class string{
public :
.....
String& operator=(String rhs){
rhs.swap(*this);//不需要考虑自复制的情况了
return *this;
}
void swap(String& rhs)noexcept{
using std::swap;
swap(data_,rhs.data_);
swap(size_,rhs.size);
swap(capacity_, rhs.capacity);
}
private:
unique ptr<char[]> data {};
size_t size_{};
size_t capacity_{};
};
但是对于左值的赋值来说,会在有重复赋值时每次都去分配内存,产生不必要的开销
对于上面的String类,这样实现会更好
class string {
public:
string& operator=(const String& rhs){
if(this != &rhs){
if(capacity_<rhs.size ){
data =make_unique<char[]>(rhs.size_+ 1);
capacity_=rhs.size ;
}
memcpy(data .get(),rhs.data_.get(),rhs.size_+ 1);
size =rhs.size ;
}
return *this;
}
String& operator=(String&& rhs)noexcept{
String(std::move(rhs)).swap(*this);
return *this;
}
//如果使用频率很高,推荐进行这样的优化