Effective C++ Item 10,11 Have assignment operators return a reference to *this Handle assignment to ...

If you want to concatenate assignment like this

int x, y, z;
x = y = z = 15;

The convention is to make the assignment operators return a reference to *this.

 

11 Handle assignmnet to self in operator = 

You can easily assign an object to itself without knowing it

// Example 1
Foo *px, *py;
px = py;

//Example 2
a[i] = a[i];

It is dangerous to assign an object to self if your class doesn't handle this kind of opeator appropriately. Let's consider an example here:

class Bitmap{...};

class Widget {
	...
private:
	Bitmap *m_pb;
};

Widget& Widget::operator=(const Widget& rhs) {
	delete m_pb;
	m_pb = new Widget(rhs);
	return *this;
}

You will be dead if you assign an object to itself, beacause you will end up holding a pointer to a deleted object!

 

 

 

One way but not the best way to deal with self assignment is to write code to explicitly deal with this situation:

Widget& Widget::operator=(const Widget& rhs) {
	if(this == &rhs) {
		return *this;
	}
	
	delete m_pb;
	m_pb = new Bitmap(*rhs).m_ph;
	return *this;
}

This is not the best way because above this operator is not exception-safe. What does that mean? Imagine what if an exception is thrown when

ph = new Bitmap(*rhs.m_ph)

is been executed(for example, not enough memory), then the object will hold a pointer to a deleted object.

 

Luckily, making operator= safe renders it self-assignmnet-sage, too. So, the best way to accomplish that is:

Widget& Widget::operator=(const Widget& rhs) {
	Bitmap* tmp = m_pb;
	pb = new Bitmap(*rhs.m_pb);
	delete tmp;
	return *this;
}

Now if "new Bitmap" throw an exception, pb remains unchanged. Even without the identity test, this code handle assignment to self, because we make a copy of the original bitmap, point to the copy we made, and then delete the original Bitmap.

 

A more straightforward way to do so is to use exception-safe function swap

Widget& Widget::operator=(const Widget& ths) {
	Widget temp(ths);
	swap(temp);
	return *this;
}

  

转载于:https://www.cnblogs.com/xinsheng/p/3572668.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值