在一个空class中,如果你自己没用声明,编译器会为你声明一个copy构造函数,一个copy assignment构造函数,以及一个析构函数,这些函数都是public且inline的。
如果你写class A{}
相当于写了
class A{
A(); //default
~A();
A(A & rhs); //copy
A& operatpr=(const A& rhs){} //copy assignment
}
A e1 // default
A e2(e1) ; copy
e2 = e1; // copy assginment copy
考虑下面的例子
tmplete<class T>
class NameObject
{
public:
NameObjecy(std::string &name , const T& value);
...
private:
std::string &nameValue;
const T objectValue;
}
下面会发生什么情况呢?
std::string newDog("Perse");
std::string oldDog("stach");
NameObject<int> p(newDog , 2);
NameObject<int> s(oldDog , 36);
p = s; //现在p的变量会发生什么事情?? 编译器唯一的做法就是拒绝编译
所以当在一个内含reference成员的class内支持赋值操作, 你必须自己定义copy assignment操作符, 对于内含const 成员的class
, 也一样。
如果基类将copy assignment 声明为private , 派生类自然无法调用基类中私有的成员函数。
若不想使用编译器自动生成的函数,就该明确的拒绝
最简单的方法就是定义一个基类,并且将copy 构造,copy assignment操作符声明为private就好。
class A
{
protected:
A(){}
~A(){}
private:
A(const A&);
A& operator=(const A&)
};
class B :private A
{
....
}
一定要注意,不能以public继承,以及A的析构函数不一定的为virtual等。
这项技术虽然可以解决copy构造等的禁用,但是也可能导致多重继承。