1.const引用
1.1.非const引用,只能绑定到同类型对象;
1.2.const引用,咋可以绑定到不同但相关的类型的对象,或绑定到右值;
double a = 3.14;
const int &b = a; //right
2.const与iterator
2.1. const_iterator: 只读容器内元素;
for(vector<string>::const_iterator iter = text.bgin(); iter != text.end(); ++iter)
cout<<*iter<<endl; //right
*iter=" "; //wrong
2.2. const与iterator一起使用则是说明迭代器不能修改,但内容可以;
vector<int> num(10);
const vector<int>::iterator iter = num.begin();
*iter=1; //right
++iter; //wrong
2.3. 任何改变vector的操作都会使已有的迭代器失效,例如: push_back.
3.const与指针
3.1指向const对象的指针
const double *cptr;
*cptr = 42; //error: 不能通过cptr修改其所指对象的值,但可可以使其指向另一个const对象
const double pi = 3.14;
double *ptr = pi // error:ptr是普通指针
const double *cptr = &pi //right: cptr是指向const对象的指针
不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址
const int universe = 42;
const void *cpv = &universe: //right
void *pv = &universe;//wrong
允许把非const对象的地址赋给const对象的指针
double dval = 3.14;
cptr = &dval;//ok:但是任何通过cptr修改其值的行为,都会导致编译错误
可以将指向const的指针理解为“自以为指向const的指针”
int Num = 0;
int *const Num_constp = &Num;//Num_constp是const指针
任何给const指针赋值(即使是相同值)的行为都会导致编译错误(与任何const量一样,const指针必须在定义时初始化):
Num_constp;//error
指针所指向对象的值可以修改
*Num_constp = 0;//right;只要符合该对象的类型
3.3 指向const对象的const指针(都不许改)
const double pi = 3.14;
const double *const pi_ptr = &pi
3.4
const pstring cstr;
cstr是什么类型呢?
const string *cstr;//wrong;因为const修饰的是一个类型;
srting *const cstr;//right
难以理解是因为const限定符的位置既可以放在类型前也可以放在类型后;
string const s1; const string s2;//二者类型相同
对于typedef
string s;
typedef string *pstring;
//三种形式都代表指向string类型的const指针
const pstring cstr1 = &s;
pstring const cstr2 = &s;//容易理解
string *const cstr3 = &s;