条款26: 当心潜在的歧义
即使cpp支持潜在二义性/歧义,也不要使用。
void f(int);
void f(char);
double d = 6.02;
f(d); //需要明确转换
多继承充满了潜在二义性/歧义的可能。
class Base1 {public: int doIt();};
class Base2 {public: void doIt();};
class Derived: public Base1,public Base2 {...};
Derived d;
d.doIt(); // 错误!——二义
d.Base1::doIt(); // 正确, 调用Base1::doIt
d.Base2::doIt(); // 正确, 调用Base2::doIt
改变一个类成员的访问权限不应该改变程序的含义。
条款27: 如果不想使用隐式生成的函数就要显式地禁止它
operator=函数会被C++编译器自动生成,需要明确禁止生成。
template<class T>
class Array {
private:
Array& operator=(const Array& rhs); // 不要定义这个函数!
Array& operator=(const Array& rhs)=delete;//新版cpp语法支持
...
};
赋值和拷贝构造函数具有行为上的相似性.