const关键字的用法

来源:互联网 发布:求剑若此不亦惑乎 编辑:程序博客网 时间:2024/04/30 19:24

一  概述

      被const修饰的变量都是只读的,当你的程序改变其值的时候,编译器会报错。const一般用来修饰变量,函数的参数,返回值和函数本身等。

1.1   修饰变量

const int a = 10;   //定义一个const的int变量const char * p = "hello world"; //const字符串char * const p = "hello world"; //const指针pconst char * const p = "hello world"; //指向const字符串的const指针p
1.2  函数参数
       const只能修饰输入参数:输入参数采用指针传递的时候,使用const可以防止意外改变指针所指的值,比如 void strcopy( char * strdest, const char * strsrc);

       如果参数是值传递的话,那么就不用加上const修饰了,因为值传递的原理是申请一个临时的变量,将参数赋值给该变量,因此对临时变量的操作不会影响到原来变量的值。

      对于非内部数据类型的变量:void func(String a),如果不采用引用传递的话,函数效率很低,会调用函数的构造函数和析构函数来建立一个临时的String对象,加了引用后,如果程序中要改变参数的话,这样是不行的,我们需要加上const,正确的形式为:void func(const String &a)。对于内部数据直接值传递就好了,因为不会有构造函数和析构函数的产生。

1.3  返回值

    (1)如果给采用指针传递的方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能修改,该返回值只能赋值给加了const修饰的同类型指针。

   const char *   GetString(void);

   const char * p = GetString();

  (2) 如果函数采用了值传递的方式,那么不需要加const,因为函数会把返回值复制到外部临时的存储单元中。

   int GetInt(void)   错误的形式:const int GetInt(void)

  (3) 函数采用引用传递的场合不多,这种方式一般只出现在类的赋值函数中,是为了方便连续赋值。

  String  strOne, strTwo, strThree;

   strOne = strTwo = strThree;

 1.4 cosnt成员函数

   任何不会修改数据成员的函数应该声明为const类型,在const函数中修改了成员变量或者调用了非const函数,编译器都会报错。

class Stack{public:void Push(int a);int Pop(void);int GetCount(void) const;private:int m_num;int m_data[5];};int Stack::GetCount(void) const{Push(1);  //非const函数++m_num; // 改变成员变量的值        return m_num; }

用好了const可以给你的程序带来很好的健壮性和高效率性