C++中 常量引用、指向常量的指针、常量指针的区别

先初步了解引用、指针的一些注意事项。


引用并非对象

引用必须初始化

引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起

类型要严格匹配

int &a = 10;             //错误:引用类型的初始值必须是一个对象

double a = 3.14;
int &b = a;              //错误:此处引用类型的初始值必须是int型对象

指针本身就是对象

指针的类型要和它指向的对象严格匹配

double dval;
double *pd = &dval;      //正确
double *pd2 = pd;        //正确

int *pi = pd;            //错误:指针pi的类型和pd的类型不匹配
pi = &dval;              //错误:试图把double型对象的地址赋给int型指针


有例外:

引入const 限定符

常量引用

初始化常量引用时允许用任意表达式作为初始值

int i = 42;
const int &r1 = i;       //正确:允许将const int & 绑定到一个普通int对象上
const int &r2 = 42;      //正确
const int &r3 = r1 * 2;  //正确
int &r4 = r1 * 2;        //错误

double dval = 3.14;
const int &ri = dval;    //正确
//等价于
const int temp = dval;
const int &ri = temp;

int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0;                  //正确
r2 = 0;                  //错误

指向常量的指针

int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0;                  //正确
r2 = 0;                  //错误


const double p = 3.14;
double*ptr = &p;         //错误
const double*cptr = &p;  //正确
*cptr = 42;              //错误

double dval = 3.14;      
const double*cptr = &dval;//正确
和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。


Tip:

所谓指向常量的指针或引用(即常量引用、指向常量的指针),不过是指针或引用“自以为是”罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值,但这些对象却可以通过其他途径改变。


常量指针

必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。常量指针并不意味着不能通过指针修改其所指对象的值。

int errNumb = 0;
int *const curErr = &errNumb;      //curErr将一直指向errNumb
const double p = 3.14159;
const double*const pip = &p;       //由于是常量p,因而pip是一个指向常量对象的常量指针,将一直指向p
*pip = 2.72;                       //错误:pip是一个指向常量的指针
if (*curErr)
{
	errorHandler();
	*curErr = 0;               //正确:把curErr所指的对象的值重置
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值