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

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

https://blog.csdn.net/Rueing839/article/details/48416907

原创 2015年09月13日 17:11:11

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

 

引用并非对象

引用必须初始化

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

类型要严格匹配

 

[cpp] view plain copy
 
  1. int &a = 10;             //错误:引用类型的初始值必须是一个对象  
  2.   
  3. double a = 3.14;  
  4. int &b = a;              //错误:此处引用类型的初始值必须是int型对象  

指针本身就是对象

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

 

[cpp] view plain copy
 
  1. double dval;  
  2. double *pd = &dval;      //正确  
  3. double *pd2 = pd;        //正确  
  4.   
  5. int *pi = pd;            //错误:指针pi的类型和pd的类型不匹配  
  6. pi = &dval;              //错误:试图把double型对象的地址赋给int型指针  

 

有例外:

引入const 限定符

常量引用

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

[cpp] view plain copy
 
  1. int i = 42;  
  2. const int &r1 = i;       //正确:允许将const int & 绑定到一个普通int对象上  
  3. const int &r2 = 42;      //正确  
  4. const int &r3 = r1 * 2;  //正确  
  5. int &r4 = r1 * 2;        //错误  
  6.   
  7. double dval = 3.14;  
  8. const int &ri = dval;    //正确  
  9. //等价于  
  10. const int temp = dval;  
  11. const int &ri = temp;  
  12.   
  13. int i = 42;  
  14. int &r1 = i;  
  15. const int &r2 = i;  
  16. r1 = 0;                  //正确  
  17. r2 = 0;                  //错误  

指向常量的指针

 

[cpp] view plain copy
 
  1. int i = 42;  
  2. int &r1 = i;  
  3. const int &r2 = i;  
  4. r1 = 0;                  //正确  
  5. r2 = 0;                  //错误  
  6.   
  7.   
  8. const double p = 3.14;  
  9. double*ptr = &p;         //错误  
  10. const double*cptr = &p;  //正确  
  11. *cptr = 42;              //错误  
  12.   
  13. double dval = 3.14;        
  14. const double*cptr = &dval;//正确  
和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。

 

Tip:

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

 

常量指针

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

 

[cpp] view plain copy
 
  1. int errNumb = 0;  
  2. int *const curErr = &errNumb;      //curErr将一直指向errNumb  
  3. const double p = 3.14159;  
  4. const double*const pip = &p;       //由于是常量p,因而pip是一个指向常量对象的常量指针,将一直指向p  
  5. *pip = 2.72;                       //错误:pip是一个指向常量的指针  
  6. if (*curErr)  
  7. {  
  8.     errorHandler();  
  9.     *curErr = 0;               //正确:把curErr所指的对象的值重置  
  10. }  



版权

 

// constRef.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    {
        int i = 42;  
        const int &r1 = i;       //正确:允许将const int & 绑定到一个普通int对象上  
        const int &r2 = 42;      //正确  
        const int &r3 = r1 * 2;  //正确  
        //int &r4 = r1;//int &r4 = r1 * 2;        //错误  
        printf("r1:%d\n",r1);
        i+=1;
        printf("r1:%d\n",r1);
    }

    {
        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;  
        printf("i:%d,r1:%d,r2:%d\n",i,r1,r2);
        r1 = 0;                  //正确  
        //r2 = 0;                  //错误 
        printf("i:%d,r1:%d,r2:%d\n",i,r1,r2);
    }    

/*
Hello World!
r1:42
r1:43
i:42,r1:42,r2:42
i:0,r1:0,r2:0
Press any key to continue
*/

    return 0;
}

 

posted @ 2018-04-02 17:08  sky20080101  阅读(124)  评论(0)    收藏  举报