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;
    }
//如果使用频率很高,推荐进行这样的优化

目录