您的位置:首页 > 编程语言 > C语言/C++

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

2015-09-13 17:11 330 查看
先初步了解引用、指针的一些注意事项。

引用并非对象

引用必须初始化

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

类型要严格匹配

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所指的对象的值重置
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: