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