温习c++至引用部分,做如下整理。
1. const
用于修饰变量,表明不能修改。常用于修饰函数参数和普通变量。常问的点有指针常量和常量指针。
指针常量:int * const p; 表明指针p是一个常量,指向一个int行变量。
int a;
int b;
int * const p = &a;
p = &b; //指针p不可修改
常量指针: const int *p; 表明p指向是一个int型的常量。
int a = 1;
const int b = 2;
const int *p = &a;
p = &b;
*p = 2; //错,p指向的内容不可修改
记忆的话很好记,常量指针就是 先常量(const)再指针(*),指针常量相反。
2. const用法
标明不可改变
修饰函数参数
当希望函数参数在函数内部不改变,可用const修饰。对基本数据类型Int等无必要,对指针和类可用.如
void Fun(const char *pStr);
void Fun(A a);
void Fun(const A &a); /* 当希望对象a不可改变时,为减少对临时对象的拷贝,复制,析构,可以使用对象A的const引用。*/
修饰变量
常用的用法,修饰不可更改的变量。
修饰函数返回值
希望函数返回值不可改变,如string的c_str用法。
const char * c_str(std::string str);
修饰函数定义体
任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const 成员函数
private:
int m_num;
int m_data[100];
};
3. 引用
开始学习的时候都说引用是一个别名,个人感觉太笼统,查阅相关资料(C++中引用的本质)并自行验证后发现引用就是一个指针,有地址空间,内部存放其他变量的地址。
例证如下:从汇编语言来看,两者本质一样。
int i=5;
00A013DE mov dword ptr [i],5 //将文字常量5送入变量i
int &ri=i;
00A013E5 lea eax,[i] //将变量i的地址送入寄存器eax
00A013E8 mov dword ptr [ri],eax //将寄存器的内容(也就是变量i的地址)送入变量ri
ri=8;
00A013EB mov eax,dword ptr [ri] //将变量ri的值送入寄存器eax
00A013EE mov dword ptr [eax],8 //将数值8送入以eax的内容为地址的单元中
return 0;
00A013F4 xor eax,eax
这里顺便提到一些概念。变量只是编译器给的一个抽象概念,实际上只有地址和地址空间内容。
4. const引用和非const引用
区别在于const引用可以绑定到类似类型和右值上。不过不可修改。例:
double d = 12.12;
const int & a = d;
const int & b = 12;
非const引用不能绑定右值和类似类型,只能绑定同类型。例:
double d = 12.12;
int & a = 1; //错,不能绑定右值
int & b = d;//错,不能绑定非 同类型的变量
int aa = 1;
int & c = aa; //对
为何如此呢,具体原因可看c++设计和演化,在c++2.0时做出了该规定。