1 指针与引用
int val = 20;
int& valr = val;
int* p = &val;
int* &valr2 = p;
cout << &val << endl;
cout << p << endl;
cout << valr2 << endl;
cout << val << endl;
cout << valr << endl;
cout << *valr2 << endl;
2 引用与常引用
int val = 20;
const int& valr1 = val;
int& valr = 20; /*error*/
const int& valr2 = 20;
int& valr = 20; /error/ 引用的初始化必须可以作为左值,20是数值,不可以作为左值;
const int& valr2 = 20; 这里通过int temp = int(20);构建一个temp,然后再通过temp初始化const int&,这个temp一直存在,直到程序块结束;此时会为常引用分配存储空间;
int val = 2012;
int& valr = val+1;
// error,同样val+1不是一个左值
// 所以不能用来初始化int&
const int& valr1 = val+1;
// ok,也是通过中间的临时变量处理
3 常引用结合指针
int val = 2012;
int*& valr = &val;
// error,因为&val不是一个左值
// &val获取的是一个地址,不能进行&val++之类的操作
int* const& valr = &val;
// ok,const T&就没有上面
// 这种限制了,&val构建中间变量,然后再初始化,
// 注意const不能放在*之前,否则就是修饰指针所指的对象了
const int var = 2012;
int*& varr = &var; // error,显然的
int* const& varr = &var; // error,因为var是const int类型的
const int* const& varr = &var; // ok,满足要求
const int var = 20;
const int* p = &var;
const int* &varr = p; // ok,此时不需要const&,因为p是左值
const int val = 2012;
const int* p = &val;
const int* &pr = p; // ok,p是左值
const int* const& pr1 = &val;
// ok,通过中间变量初始化
int* const& pr2 = &val;
// error,引用的类型不符合,一个是const int*,另一个是int*
4 常量引用的存储空间分配
C++中的const常量可能分配存储空间,也可能不分配存储空间;
以下有3种情况会分配存储空间:
1,当const常量为全局,并且要在其它文件中使用,会分配存储空间;
2,当使用&操作符,取const常量的地址时,会分配存储空间;
3,当const int& a = 100; const修饰引用时,也会分配存储空间;
5 const&初始化的类型转换
int val = 2012;
const double& valr = val;
double dval = 3.14159;
const int& valr = dval;
// ok,temp构建的时候,类型转换int temp = int(dval);
const int& valr1 = 3.14159;
// ok,temp构建的时候,类型转换int temp = int(3.14159);
int& valr2 = dval;
// error,没有temp进行中间的类型转换
int& valr3 = 3.14159;
// error,类似,没有中间变量进行类型转换