读c++ primer 5

作为一个非科班的码农,有时候会有种力不从心的感觉,说到底还是基础不牢固,很多印象很模糊,万丈高楼平地起,希望自己切勿好高骛远,趁着这段时间,总结一下自己掌握得还不够深刻的知识点。

一、引用

1、引用并非为对象,它只是为对象取了另外一个名字。定义了一个引用后,对其所进行的所有操作,都是在与之绑定的对象上进行的。

2、引用必须初始化,一旦定义了引用,就无法令其再绑定到另外的对象。

3、每个引用标识符都必须以符号&开头。

二、指针和引用的不同点

1、指针本身就是对象,但是引用不是

2、允许对指针再次赋值和拷贝,并且指针的生命周期内,它可以先后指向不同的对象。

3、指针无须在定义的时候赋初值,但会拥有一个不确定的值。

三、指针和const

const int p = 1;  //p是常量,它的值不可改变

int *ptr=&p; //错误 ptr是一个普通指针,不可指向常量

const int *cptr=&p; //正确

*cptr=5; //错误,不能给*ptr赋值

int a=65;

cptr=&a; //正确 但是不能通过cptr改变a的值

int b=0;

int *const p1=&b; //不能改变p1的值,这是一个顶层const

const int c=42;

const int *p2=&c; //允许改变p2的值,因为这是一个底层const

顶层const表示指针本身是个常量。

底层const表示指针指向的对象是常量。

const int * const p3 =p2; //靠右的const是顶层const  靠左的const是底层const

int &r=c; //错误

p2=&b; //正确 int*能转换为const int *

四、c++ 11 auto

自动类型推算,必须有初始值。

五、显示转换

static_cast:

1、任何有明确定义的类型转换,只要不包含底层const,都可以使用static_cast

2、当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。可以消除警告信息。

3、对于编译器无法自动执行的类型,使用static_cast。

double b=1.00; void *p=&b;

double*dp=static_cast<double*>(p);

const_cast:

const_cast只能改变运算对象的底层const。

const char*p;

char *p=const_cast<char*>(p);

六、函数

局部静态对象:

在程序中执行路径第一次,经过对象定义的语句时初始化,并且到程序终止时才能销毁。

在此期间,即使对象所在的函数结束执行,也不会对它有影响。

size_t func()

{

static size_t cnt=0; //调用函数结束后,这个值仍然有效

return ++cnt;

}

引用参数:

1、使用引用避免拷贝,提高效率。当函数无须修改引用形参的值时,最好使用常量引用

2、使用引用形参返回额外的信息。

3、不要返回局部对象的引用或者指针

4、通过引用返回左值。

函数指针:

函数指针返回函数而不是对象,和其他指针一样,函数指针指向某种特定类型。

bool (&p)(const string&,const string &) //p 指向函数的指针

七、类

1、在c++中class 与struct的唯一区别:

默认访问权限不同。class默认private,struct默认public

2、类成员的初始化顺序与它们在类定义中出现的顺序一致

3、类的静态成员存在于任何对象之外。对象中不包含任何与静态数据成员有关的数据。类的静态成员被所有类对象共享。

可以通过作用域运算符直接访问静态成员。double r; r=A::func(); //假定func是一个静态成员函数,返回值为double。

虽然静态成员不属于类的某个对象,但我们仍然可以使用类的对象、引用、指针等访问静态成员。

4、类似于全局变量。静态数据成员定义在任何函数之外。因为他一旦被定义,就一直存在于程序的整个生命周期。

八、容器

顺序容器:

vector

可变大小数组,支持快速随机访问,在尾部插入或者删除元素可能很慢。

array

固定大小数组。支持快速随机访问,不能添加或者删除元素。

list

双向链表,只支持双向顺序访问,在list中任何位置进行插入、删除操作,速度都很快

forward_list

单向链表,只支持单向顺序访问,在链表任何位置插入、删除都快。

deque

双端队列,支持快速随机访问。在头尾位置插入或者删除,速度很快。

string

与vector相似容器,但是专门用于保存字符,随机访问很快。

关联容器:

map

关联数组:保存关键字-值对

set

关键字即值:即只保存关键字容器

multimap

关键字可以重复出现的map

multiset

关键字可以重复出现的set

map中添加元素的4种方法:

m.insert((word,1));

m.insert(makepair(word,1));

m.insert(pair<string,size_t>(word,1));

m.insert(map<string,size_t>::value_type(word,1));

九、动态内存

智能指针:

自动释放所指向的对象。

1、shared_ptr: shared_ptr<int>p;

允许多个指针指向同一对象。

2、unique_ptr

独占所指向的对象,当unique_ptr被销毁时,其所指向的对象也被销毁。

可以用reset来将一个新指针赋予一个shared_ptr

p=new int(1024); //错误,不能将一个指针赋予shared_ptr

p.reset(new int(1024)); //正确

reset会更新引用计数,如果需要,会释放p所指向的对象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值