const用法大集合

原创 2016年08月30日 17:31:26

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;
 }
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 多线程处理之多线程用法大集合 第 3 页

第 3 页 ExecutorServie线程池 5.ExecutorServie线程池 通过Executors的静态方法来创建,一般有三种: 1.单线程 :Executors.new...

多线程之多线程用法大集合(未整理)

handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程。 1.如果像这样,是可以操作u...

const用法详细解释

  • 2014年11月04日 09:20
  • 98KB
  • 下载

Android 多线程处理之多线程用法大集合

handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程。 1.如果像这样,是可以操作u...

C++中const用法总结

  • 2014年03月25日 16:30
  • 13KB
  • 下载

const用法详解

  • 2014年03月31日 23:05
  • 35KB
  • 下载

Android 多线程处理之多线程用法大集合

handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程。 1.如果像这样,是可以操...
  • Crea_Sa
  • Crea_Sa
  • 2015年10月18日 15:40
  • 146

const用法与详细解释

  • 2015年10月18日 13:19
  • 45KB
  • 下载

const用法详解

  • 2012年05月23日 11:16
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:const用法大集合
举报原因:
原因补充:

(最多只允许输入30个字)