c++学习笔记之复制控制与stl算法

1、reverse迭代器
在逻辑上,rbegin指向最后一个元素,rend指向第一个元素的前一个位置。
但是在实际实现上,rbegin指向最后一个元素的下一个位置,rend指向第一个元素。
reverse迭代器的物理位置与逻辑位置差1
逻辑值比物理位置减少了1.
采用这种实现的好处是:将iterator转化成reverse_iterator之后的区间,与之间的区间恰好相反,但内容相同。例如[2, 7),用reverse表达是[6, 1)内容恰好相同。
reverse迭代器不能用于erase函数。删除的正确方式是:

it = string::reverse_iterator(s.erase((++it).base()));

2、编译器自动为我们合成一个拷贝构造函数。当用户自行编写时不再提供。
含有指针成员变量的类在复制时,有两种选择:
复制指针的值,这样复制完毕后,两个对象指向同一块资源,这叫做浅拷贝 shallow copy
复制指针所指向的资源,复制完毕后,两个对象各自拥有自己的资源,这叫做深拷贝 deep copy
编译器默认的是浅拷贝,此时如果需要深拷贝,需要自己编写拷贝构造函数。

3、编译器自动合成赋值操作符。
赋值操作符,需要先释放掉以前持有的资源。同时必须处理自身赋值的问题。
复制构造函数、赋值运算符以及析构函数,称为三法则,一旦提供了其中一个,务必提供其余两个。以String为例:
涉及到深拷贝、浅拷贝问题,所以需要提供拷贝构造函数
然后,为了保持一致,赋值运算符也应该实现深拷贝
既然实现深拷贝,那么必定申请了资源(例如内存),所以必然需要析构函数来手工释放。
一个空类,编译器提供默认无参数构造函数、拷贝构造函数、赋值运算符以及析构函数,一共四个函数。

4、禁止一个类复制和赋值的方法:
把copy构造函数和赋值运算符设为private
只声明,不实现。
复制和赋值必须保证在程序的语义上具有一致性。
禁止类的复制和赋值:
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \            TypeName(const TypeName&); \            void operator=(const TypeName&)

5、如果一个类,不需要复制和赋值,那就禁用这种能力,这可以帮助避免大量潜在的bug。
如果一个类,实现了像value一样的复制和赋值能力(意味着复制和赋值后,两个对象没有任何关联,或者逻辑上看起来无任何关联),那么就称这个类的对象为值语义(value semantics)。如果类不能复制,或者复制后对象之间的资源归属纠缠不清,那么称为对象语义(object semantics),或者引用语义(reference semantics)。

ps:随笔::命名空间是文件夹,类是箱子,类放在命名空间下
#include <unordered_map> 哈希表实现
先不用关心for_each返回值
std::copy(vec.begin(),vec.end(),back_iterator(list))
拷贝构造函数 形参const引用
student(const student &other)
编译器自动提供默认无参数构造函数和拷贝构造函数,如果自己提供拷贝构造函数,两者都不再提供
=编译器 自动提供 赋值调用=操作符,如果有指针成员,编译器只执行简单的指针赋值 
赋值是存在两个对象,复制时无中生有
一个类 不能复制也不能赋值,两者同时存在,语法能通过,但是语义不符。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值