条款5:类拷贝赋值操作符不能作用于-》常量成员变量和引用成员变量
来源:互联网 发布:王尼玛 知乎 五五开 编辑:程序博客网 时间:2024/06/04 17:53
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++会拒绝这些赋值操作。因为在赋值时,会让基类成员调用基类自己的赋值构造函数,但是这时是私有的,所以就会出问题。
阅读全文
0 0
- 条款5:类拷贝赋值操作符不能作用于-》常量成员变量和引用成员变量
- C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
- C++类static静态成员变量和const常量成员变量(和引用相同)初始化方法
- 成员变量赋值问题【向前引用】
- Java成员变量赋值
- 类和成员变量
- C++类特殊成员变量(引用、静态、常成员变量)的初始化操作
- 成员变量的初始化和赋值
- c++笔记04---构造拷贝函数,拷贝赋值运算符函数,静态成员变量
- 使用引用成员变量
- 成员变量作用域
- 类成员变量的赋值与初始化
- 给一个类成员变量struct赋值.
- oc 面向对象特性(实例成员变量作用域限定符,类变量和类方法)
- PHP类中成员变量和函数的引用
- C++ 成员变量为引用类型和const类型,如何赋值
- Javascript类成员变量和方法作用域
- python的类变量和成员变量
- java基础学习总结——面向对象2
- vue项目创建基本使用参考
- java基础学习总结——多态(动态绑定)
- java基础学习总结——对象转型
- java中文件IO操作总结
- 条款5:类拷贝赋值操作符不能作用于-》常量成员变量和引用成员变量
- java基础学习总结——抽象类
- 基于.netstandard的权限控制组件
- mysql数据在网页上显示乱码解决方案
- 等价表达式-OJ
- Django学习笔记 -- 2 正则表达式
- 线性表-2
- Radan 自动排序文本的设置
- ajax返回json类型日期格式化