Const用法总结

 

Const用法总结

1.       把一个const对象的地址赋给一个普通的、非const对象的指针会导致编译时的错误。

const double pi = 3.14;

double *ptr = π  // error: ptr is a plain pointer

const double *cptr = π // OK: cptr is a pointer to const

2.       const修饰变量

const int nvalue;

int const nvalue; //同一个含义,都是nvalue不可变。

3.       const修饰指针

 

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     char a = 10;
  6.     const char *p1 = &a;
  7.     char const *p2 = &a;
  8.     char *const p3 = &a;
  9.  
  10.     //(*p1)++;  // error, the value of p1 is constant
  11.     p1++;       // OK, p1 canchange
  12.     //(*p2)++;  // error, the same as p1
  13.     p2++;       // OK, the sameas p1
  14.     (*p3)++;    // OK, the valueof p3 can change
  15.     //p3++;     // error, p3 is constant
  16.     a++;        // OK, wecannot change value by pointer, but we can change by this.    
  17.     return 0;
  18. }

p1和p2相同,表示指针指向的值不可变,简称指常针,虽然不能通过p1,p2修改变量,但变量本身可以修改,比如可以改变a,但不能通过指常针改变变量的值;而p3表示指针不可变,指针指向a之后不能再指向别的地址,简称常指针。

4.       const修饰成员函数

在调用成员函数时,都有1个额外的、隐含的形参this。在调用成员函数时,形参this初始化为调用函数的对象的地址。如下面的语句:

class A

{…

void func(int ) const;

…} a;

a.func(para);

就如编译器这样重写这个函数调用:

A::func(&a, para);

这里的&a相当于this指针。在普通的非const成员函数中,this的类型是1个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。即在func里无法修改对象a。用const修饰函数的目的其实就是起到一种只读的作用,任何试图修改对象的动作都会在编译时报错。

另外,在类定义时,const成员函数不能调用任何非const类型的函数,如下述代码:

 

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Demo
  5. {
  6. private:
  7.     int value;
  8. public:
  9.     Demo(int val = 0) : value(val){}
  10.     void Set(int val)
  11.     {
  12.         value = val;
  13.     }
  14.     void Test(){}
  15.     int Get() const
  16.     {
  17.         Test();
  18.         return value;
  19.     }
  20. };
  21.  
  22. int main(int argc, char **argv)
  23. {
  24.  
  25.     return 0;
  26. }
  27.  

在const函数Get()中调用非const函数Test(),编译时会报错,原因是Get()已经声明为const,即this指针所指向的对象不能发生变化,在里面又调用了Test()函数,但不能保证Test()函数不修改该对象,即在Test函数中可能发生修改对象的动作,而这与this指针的const特性违背,所以错误消息其实是不能转换this指针,因为编译器在默认情况下不能改变this指针的const特性。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值