Effective C++ 条款05 什么时候不应该使用编译器默认提供的函数

template<class T>
class NameObject {
public:
	NameObject(string& name, const T& value);

private:
	string& nameValue;
	const T objectValue;
};
string newDog("Persephone");
string oldDog("satch");
NameObject<int> p(newDog, 2);
NameObject<int> s(oldDog, 36);
p = s;

     赋值之前,不论p.nameValue和s.nameValue都指向string对象(当然不是同一个)。赋值动作该如何影响p.nameValue呢?赋值之后p.nameValue应该指向s.nameValue所指的那个string吗?也就是说reference本身可以被改动吗?如果是那可就开辟了新天地,因为C++不允许“让reference改指向不同对象”换一个想法,p.nameValue所指的那个string对象改被修改,进而影响“持有pointers或references而且指向该string”的其他对象吗?也就是对象不被直接牵扯到赋值操作内?编译器生成的拷贝赋值运算符究竟该怎么做呢?

     面对这个难题,C++的响应是拒绝编译那一行赋值动作。如果你打算在一个“内含引用或指针成员”的类内支持赋值操作,你必须自己定义拷贝赋值运算符。面对“内含const成员”(如本例之objectValue)的classes,编译器的反应也是一样。更改const成员是不合法的,所以编译器不知道如何在它自己生成的赋值函数内面对它们。最后还有一种情况:如果某个基类将拷贝赋值运算符声明为private,编译器将拒绝为其派生类生成一个拷贝赋值运算符。毕竟编译器为派生类所生成的拷贝赋值运算符想象中可以处理基类部分,但它们当然无法调用派生类无权调用的成员函数。编译器双手一摊,无能为力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值