c++复习笔记4

操作符重载

四则运算符、关系操作符、下标操作符、赋值操作符、流操作符

c++复习笔记4

c++复习笔记4

c++复习笔记4


 

1 . 四则运算符

  1)例子(重载为普通函数):

c++复习笔记4

c++复习笔记4

 

(重载为友元函数):

c++复习笔记4

c++复习笔记4

 

  2)注意点:

c++复习笔记4

c++复习笔记4

c++复习笔记4
 

2. 关系操作符

c++复习笔记4

 

3. 下标操作符

c++复习笔记4

 

例子:

c++复习笔记4

c++复习笔记4

 

4. 赋值操作符

1) 一般形式

返回本对象的引用,本对象接受其他对象的值,保证赋值可以连续操作。

 

c++复习笔记4

c++复习笔记4

 

2)复合赋值操作符重载

c++复习笔记4

c++复习笔记4

 

特殊情况:前缀递增(递减)后缀递增(递减)操作符

前缀和后缀操作符的区别:书写格式不同,因此:前缀赋值操作符返回的是对本对象的引用,后缀赋值操作符返回的是原始对象的一个拷贝。

c++复习笔记4

 

3)赋值构造与拷贝构造

c++复习笔记4

 

例子:

c++复习笔记4

explicit关键字,避免单参数n转换成A类的一个对象,即避免n调用单参数版本的构造函数进行转换。

 

4)浅拷贝与深拷贝

浅拷贝:其中红色部分的函数不写编译器也会自动生成,将数据成员逐一拷贝。

c++复习笔记4

c++复习笔记4

c++复习笔记4

 

问题分析:

c++复习笔记4

在main函数中,a和b都是在栈上分配的局部变量,对象a和b的的成员_p都指向同一片堆存储区,两个对象的两个指针指向同一个存储区。main函数结束是会销毁局部变量,销毁a时析构函数调用delete销毁该存储区,将a的_p设为NULL,释放该存储区;然后销毁b对象,b的_p不是NULL,变成了空悬指针,b对象析构调用delete时系统崩溃。

 

深拷贝:

注意:在拷贝之前先销毁_p原来指向的数据对象。

c++复习笔记4

 

深拷贝堆栈图分析:

c++复习笔记4

产生原始对象的完整副本,指针指向的数据对象也要拷贝。

 

5):c++11 新特性:移动语义(解决深拷贝与浅拷贝问题)

深拷贝在进行拷贝时需要重新构造一片存储区,需要销毁目标对象的原始存储区,频繁的进行动态内存的分配与销毁,效率低。将a对象_p指针的所有权移交给新对象b的指针,并将a的_p赋值为NULL。

c++复习笔记4

 

a' .  左值与右值

左值可以可以赋值修改,右值不能被赋值而只能赋值给其他量。

赋值四步:例如 x = x;

第一步,取左边x的左值;第二步,取右边x的左值(实际取的是x这个量对应的地址);第三步,从右边的x指向的地址处取右值(实际上取得是x的值),然后把x的值赋值给x(把值重新放回内存区域里);第四步,把放进去的值作为赋值表达式的结果返回(C编译器做的)。

c++复习笔记4

 

b'.  左值引用于右值引用

引用相当于别名,访问的是原始的数据对象。

左值引用是访问目标数据对象并可以进行修改其值。

c++复习笔记4

 

c'.  移动赋值与移动构造

右值引用在函数内部是当做左值引用来看待的。

c++复习笔记4

c++复习笔记4

 

d'.  移动语义重载

若深拷贝语义和移动语义同时需要,则需要进行移动语义重载。

c++复习笔记4

c++复习笔记4

注意使用静态转型static_cast将左值引用转换为右值引用,否则将是深拷贝。

 

e'. 左值引用实现移动语义

c++复习笔记4

c++复习笔记4

c++复习笔记4

通过canst_cast将非常量转为常量,就可以实现移动构造(赋值)到深拷贝构造(赋值)的转换。

 

f'.  右值引用的意义

c++复习笔记4

 

c++复习笔记4

 

5. 流操作符

  1)一般形式

一般形式下流操作符重载的格式是固定的,必须返回输入流或输出流的引用

c++复习笔记4

c++复习笔记4

 

2)流与文件

a'.  标准流类库

c++复习笔记4

c++复习笔记4

 

b'.  插入与提取

c++复习笔记4

 

c'.  常用输入输出流函数

c++复习笔记4

流输出的效率比printf函数的效率低。

 

d'.  操纵符

预定义操纵符

c++复习笔记4

c++复习笔记4

c++复习笔记4

 

3)文件输入输出

c++复习笔记4

 

流定位

c++复习笔记4

 

流定位

c++复习笔记4

 

6. 操作符重载的函数原型列表:

c++复习笔记4

c++复习笔记4

c++复习笔记4

应用程序频繁开辟小数组时,频繁new和delete从全局堆中进行分配效率低,重载new操作符可以在程序开始前程序提前从操作系统申请一片大的内存区域(缓冲池),应用程序开辟和返回小内存就从缓冲池中进行,提升整个程序的效率;还可以为应用程序提供垃圾回收机制,处理指针。一般重载为类的成员函数。

c++复习笔记4

c++复习笔记4

c++复习笔记4