条款5:类拷贝赋值操作符不能作用于-》常量成员变量和引用成员变量

1.知识点:

什么时候一个空类,不再是空类了呢?当c++编译器处理之后。

如果没有定义,编译器会为你产生四个函数:

1)  默认构造函数

2)  Copy构造函数

3)  赋值构造函数

4)  析构函数

注意这些函数都是public且是inline的。

这里还有一点要说明的:不是说编译器一定会为你产生这些函数,而是说,当这些函数被调用时,它们才会被编译器创建出来。

  • 举一个例子:
template<class T>

class NamedObject{
         public:
                   NamedObject(std::string& name, const T& value);
                   ...
         private:
                   std::string& nameValue;
                   const T objectValue;
}

现在考虑下面会发生什么事情:

std::string newDog("persephone");

std::string oldDog("satch");

NamedObject<int> p(newDog, 2);

NamedObject<int> s(oldDog, 36);

p = s;

如果说p.nameValue赋值后,会指向s.nameValue,则你就错了。为什么?

因为nameValue这个东西是一个指向string对象的引用。C++明文规定:不允许改变引用。

 

另一个问题:objectValue会怎么样呢,p.objectValue 会等于36吗?不会,为什么?

因为在类中,objectValue是const成员。不允许为const成员改变值。

那么我们怎么做赋值构造函数呢?我们要自己定义,这时,如果我们没有定义赋值构造函数,C++会拒绝此对象的一切赋值。



另一个例子,如果在base类中,我们把赋值构造函数定义为私有成员。派生类的赋值会怎么样呢?

这时,如果我们没有定义赋值构造函数,则C++会拒绝这些赋值操作。因为在赋值时,会让基类成员调用基类自己的赋值构造函数,但是这时是私有的,所以就会出问题。


猜你喜欢

转载自blog.csdn.net/qq_29422251/article/details/77850262