C++中重载赋值运算符=
拷贝赋值和移动赋值运算符可以把类的一个对象赋值给该类的另一个对象。此外,类还可以定义其他赋值运算符以使用别的类型作为右侧
运算对象。
举个例子,在拷贝赋值和移动赋值运算符之外,标准库 vector 类还定义了第三种赋值运算符,该运算符接受花括号内的元素列表作为参数。我们能以如下的形式使用该运算符:
vector<string> v;
v = {"a", "an", "the"};
同样,也可以把这个运算符添加到 strVec 类中
class StrVec {
public:StrVec &operator=(std::initializer_list<std::string>);//其他成员省略
};
为了与内置类型的赋值运算符保持一致(也与我们已经定义的拷贝赋值和移动赋值运算致),这个新的赋值运算符将返回其左侧运算对象
的引用:
StrVec &StrVec::operator=(initializer_list<string> il)
{// alloc_n_copy 分配内存空间并从给定范围内拷贝元素auto data = alloc_n_copy(il.begin(), il.end());free(); //销毁对象中的元素并释放内存空间elements= data.first; //更新数据成员使其指向新空间first_free = cap = data.second;return *this;
}
和拷贝赋值及移动赋值运算符一样,其他重载的赋值运算符也必须先释放当前内存空间再创建一片新空间。不同之处是,这个运算符无须
检查对象向自身的赋值,这是因为它的形参 initializer list<string>
确保 il
与 this
所指的不是同一个对象。
我们可以重载赋值运算符。不论形参的类型是什么,赋值运算符都必须定义为成员函数。
复合赋值运算符
复合赋值运算符不非得是类的成员,不过我们还是倾向于把包括复合赋值在内的所有赋值运算都定义在类的内部。为了与内置类型的复合
赋值保持一致,类中的复合赋值运算符也要返回其左侧运算对象的引用。例如,下面是 Sales_data
类中复合赋值运算符的定义:
//作为成员的二元运算符:左侧运算对象绑定到隐式的 this 指针
//假定两个对象表示的是同一本书
Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{units_sold += rhs.units_sold;revenue += rhs.revenue;return *this;
}
赋值运算符必须定义成类的成员,复合赋值运算符通常情况下也应该这样做这两类运算符都应该返回左侧运算对象的引用。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器