什么时候空类不在是一个空类呢?
答案是当C++处理过它之后。
创建了一个类,如果自己没有声明,编译器会为这个类声明一个复制构造函数、一个默认构造函数、一个析构函数和一个赋值函数。所有这些函数都是public且是inline的。
但是对于默认声明的的函数不是每种情况都可以调用的。例如像下面:
template<class T>
class Nmae
{
public:
Nmae(std::string& m_name, const T& m_data);
...
private:
std::string& name; //注意是reference
const T data; //注意是const
};
//进行如下操作
std::string newdog("shakalaka");
std::string olddog("watanabei");
Name<int> p(newdog, 2);
Nmae<int> s(olddog, 35);
p = s;
赋值之前,无论是p.name还是s.name都指向不同的string对象。如果进行赋值,那么会如何影响p.nmae呢?复制之后p.name会指向s.name所指向的那个string对象吗???也就是说reference自身可以被改动吗?答案肯定是否定的!如果遇到这中情况该如何是好呀?
面对这个难题,C++的态度是拒绝的,不进行哪一行赋值动作。如果你非要编译器指向这种赋值操作的话,那你就只能自己动手了。自己定义赋值操作符,这样编译器将会调用你自己定义的可以进行更改引用和const的赋值操作符。
还有一种情况就是:如果基类将复制操作符声明为private,编译器将拒绝为其派生类生成一个赋值操作符 。