关闭

const用法大集合

40人阅读 评论(0) 收藏 举报
分类:

C++中的const应用的很灵活,const也大大改善程序的健壮性,下面就const在C++中的各种用法,做一个总结
const的使用地方
1.定义常量
(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的

 TYPE const ValueName = value; 
 const TYPE ValueName = value;

在定义一个变量时用了const,就是常量了,在之后不能改变其值。
有的时候需要使用const变量,他的初始值不是一个常量表达式,但又确实有必要在文件中共享,这种情况下我们不希望编译器为每一个文件分别生成独立的变量,相反的,我们希望这类const对象像其他(非常量)对象一样工作,也就是说,只要在一个文件中定义了const,而在其他的文件中声明并使用它。
解决的办法是:对于const变量不管是申明还是定义都加extern关键字,定义一次就可以了

extern const int bufSize = fcn()   //一个文件中

extern const int bufSize //和上面定义的bufSize是同一个

注意:默认状态下,const对象仅在文件内有效
const对象在定义时必须初始化,因为const对象在创建后就不能更改它的值
2、指针使用CONST
(1)指针本身是常量不可变

       char* const p;   

这个用const来修饰p,说明指针本身定为常量,常量指针必须初始化,而且一旦初始化,则它的值(也就是存放在指针里的地址)就不再改变的了
(2)指针所指向的内容是常量不可变

      const char *p; 

(3)两者都不可变

         const char* const p; 

顶层const和底层const
顶层const表示指针本身是个常量
底层const表示指针所指的对象是一个常量

int i= 0
int *const p1 = &i   //不能改变p1的值,是顶层const
const int ci = 42    //不能改变ci的值,是顶层const
const int *p2 = &ci   //能改变p2的值,是底层const

(4)还有其中区别方法,沿着*号划一条线:
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
3.const修饰函数系列
1)const修饰函数参数
传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样

void testModifyConst(const int _x) {
     _x=5;   ///编译出错
}

2).const修饰成员函数
(1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)
(2)const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

#include <iostream>
  using namespace std;
  class Point{
     public :
     Point(int _x):x(_x){}
     void testConstFunction(int _x) const{
          ///错误,在const成员函数中,不能修改任何类成员变量
        x=_x;
         ///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
         modify_x(_x);
     }
     void modify_x(int _x){
         x=_x;
              }
     int x;
 };

3).const修饰函数返回值

(1)指针传递
如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改

  const int * mallocA(){  ///const data,non-const pointer
      int *a=new int(2);
      return a;
  }
  int main()
  {
      const int *a = mallocA();
      ///int *b = mallocA();  ///编译错误
     return 0;
 }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7584次
    • 积分:512
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条