C++学习笔记

a.C++11特性
1.auto关键字:编译器去分析表达式类型进而推算变量类型
auto sum=val1+val2;
编译器通过分析val1和val2的值来确定sum的类型
2.范围for语句:
for(declaration:expression)
statement
适用于序列(数组,vector,string对象)
for(int &r:v)
r+=2;//引用变量r才可以被修改
3.constexp: 修饰表达式或者函数,使得编译器知道其为常量
4.智能指针:自动释放所指向的对象(头文件memory)
shared_ptr:多个指针指向同一个对象
unique_ptr:独占所指向的对象
weak_ptr:一种弱引用,指向shared_ptr所管理的对象
智能指针是模板:
shared_ptr p;//可以指向基本类型或者stl容器
默认初始化的智能指针为空指针
1). shared_ptr:
make_shared:分配使用动态内存,必须指定想要创建的对象的类型
shared_ptr p1=make_ptr(42);//p1指向值为42
引用计数:每个shared_ptr都有一个引用计数器,计数器值为0,自动释放所管理的对象
计数器值增加:
一个shared_ptr初始化另一个shared_ptr;将其作为参数传递给另一个函数;作为函数返回值
计数器值减少:()
给shared_ptr赋予一个新值;shared_ptr被销毁(例如离开作用域)
auto p=make_ptr(43);
auto p(q);
shared_ptr的析构函数:计数器值减少,引用计数为0,销毁对象,释放内存
2)unique_ptr:
一个unique_ptr指向一个给定对象;当其被销毁时,对象也被销毁;不支持普通的拷贝和赋值操作
初始化unique_ptr必须采用直接初始化形式:
unique_ptr p(new int(12));
release()/reset()函数将指针的所有权进行转移
release():切断对象与原来指针的联系,返回指向此对象的指针,并将当前指针置为空。
unique_ptr p2(p1.release());//将所有权从p1转移给p2,p1置空
p3.reset(p2.release());//将所有权从p2转移到p3,p2置空
注:如果不进行初始化或者对象赋值,需要使用一个智能指针来保存release()返回的指针,并用delete释放内存
auto p=p1.release();
delete p;
3)weak_ptr
不控制指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象,并且weak_ptr绑定到shared_ptr不会改变shared_ptr的引用计数
weak_ptr的创建需要shared_ptr来初始化完成
auto p=make_shared(42);
weak_ptr wp§;//wp弱共享p,p的引用计数未改变
lock():返回一个指向共享对象的shared_ptr
b. const
1.常量对象必须由常量引用或者常量指针绑定,反之不成立,常量引用和常量对象可以指向非常量对象。
2.常量指针:从右向左分析
int *const p;//表示p是一个常量指针指向的是一个int型的对象,指针p里存的指向对象的地址值不可改变
const int *const p;//表示p是一个常量指针指向一个int型常量对象,指针p和指针所指的对象的值都不可改变
顶层const:表示指针本身是个常量
底层const:表示指针所指的对象是个常量,可以修改指针内容
底层const: const int *p;//表示p指针指向一个常量的int对象
c.new 和delete 动态内存管理易出现的问题:
1.忘记delete,内存泄漏
2.使用已经delete后的对象,通过赋予nullptr,可以检查出这种错误
3.同一块内存被释放两次(例如浅拷贝,两个指针指向同一个对象,当一个delete后,另一个又去delete会发生这种错误)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值