C++Primer : 第十四章 :赋值运算符

赋值运算符
赋值运算符可以把类的一个对象赋值给该类的另一个对象。此时,类还可以定义其它赋值运算符以使用别的类型作为右侧运算对象。
在拷贝赋值和移动赋值之外,标准库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) {
	auto data = alloc_n_copy(il.begin(), il.end());      //alloc_n_copy分配内存空间并从给定范围内拷贝元素
	free();         //销毁对象中的元素使其指向新空间
	elements = data.first;    //更新数据成员使其指向新的空间
	first_free = cap = data.second;
	return *this;
}

和拷贝赋值以及移动赋值运算符一样,其他重载的赋值运算符也必须先释放当前内存空间,再创建一片新空间。不同之处是,这个运算符无需检查对象向自身的赋值,这是因为它的形参initializer_list<string>确保il与this所指的不是一个对象。
我们可以重载赋值运算符。不论形参的类型是什么,赋值运算符都必须定义为成员函数。

复合赋值运算符
一般也定义在类的内部,为了与内置类型的复合赋值保持一致,类中的复合赋值运算符也要返回其左侧运算对象的引用。

Sales_data& Sales_data::operator+=(const Sales_data& rhs) {
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;
}

为你的Sales_data类定义加法和复合赋值运算符

class Sales_data {
	friend Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs);
public:
	Sales_data& operator+=(const Sales_data& rhs);
};
Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs) {
	Sales_data sum = lhs;
	sum += rhs;
	return sum;
}
Sales_data& Sales_data::operator+=(const Sales_data& rhs) {
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值