现在的位置: 首页 > 综合 > 正文

const关键字的作用

2013年09月08日 ⁄ 综合 ⁄ 共 2458字 ⁄ 字号 评论关闭

const类型定义:指明变量或对象的值是不能被更新,引入的目的是为了取代预编译指令

××××××常量必须被初始化×××××××××××××××

const的作用

    A 可以定义const常量,如

             const int Max = 100;

             int Array[Max];

    B 便于进行类型检查,如

            void f(const int i){...}

      编译器就会知道i是一个常量,不允许修改

    C 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

    上面的一个例子,如果在函数体内修改了i,编译器就会报错,如,void f(const int i ){ i=10;  //error }

    D 为函数重载提供一个参考(这个不是很理解)

      class A

      {

        ...

        void f(int i )  {......} file;  //一个函数

        void f(int i ) const {......} file: //上一个函数的重载

        ...

      }

      E 可以节省空间,避免不必要的内存分配

     例如:

          #define PI 3.14159     //常量宏

          const double Pi = 3.14159  //此时并未将Pi放入ROM中

          ...

         double i = Pi;    //此时为Pi分配内存,以后不再分配!

         double I = PI;   //编译期间进行宏替换,分配内存

         double j = Pi;   //没有内存分配

         double J = PI;  //宏替换,又一次分配内存

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量是在内存中有若干个拷贝。

      F 提高效率

      编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这也使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率提高。

 

使用const

   (1) 修饰一般常量,常量组,常对象

修饰符const可以用在类型说明符前,也可以用在类型说明符后,例如:

int const x = 2;   或者  const int x = 2;

int const a[5] = {1,2,3,4,5}; 或 const int a[5] = {1,2,3,4,5};

class A;  const A a; 或 A const a;

    (2) 修饰指针

const int *A;  或 int const *A; //const修饰指向的对象,A可变,A指向的对象不可变

int *const A;    //const修饰指针A,A不可变,A指向的对象可变

const int *const A;    //指针A和A指向的对象都不可变

   (3)修饰引用

const double &A;   //该引用所引用的对象不能被更新

    (4)修饰函数的返回值

const修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如下:

const int Fun1();

    (5)修饰类的成员变量

const修饰符也可以修饰类的成员函数,格式如下:

 class ClassName

{

    public:

           int Fun() const;

           ....

};

这样,函数Fun中不能修改类里面的数据。

    (6)在另一连接文件中引用const常量

extern const int i;   //正确的引用

extern const int j = 10;  //错误,常量不可以被再次赋值

 

放在类内部的变量有什么限制?

放在类内部的变量不能定义的时候赋值,可以在类构造函数初始化列表或外部初始化。

class

{

    private:

        const int c3 = 7;    //error

        static int c4 = 7;    //error

       static const float c5 = 9;   //error

       ....

};

初始化类内部的变量

   1 初始化列表:

    class A

    {

          public:

               A(int i=0):test(i){}

          private:

               const int test;

};

   2 外部初始化

class A

{

   public:

        static const int i;

};

static const int A::i = 3;

 

const 修饰符可以把对象转变为常数对象,什么意思?

   也就是说利用const进行修饰的变量的值在程序的任意位置将不能再次被修改,就如同常数一样使用!

我们看看如下两个例子

void main(void)

{

 const int a = 10;

 int b = 20;

 

const int *pi;

 pi = &a;

 cout<< *pi << "|" << a <<endl;
 pi = &b;

 cout<< *pi << "|" << b <<endl;

}

上面的代码中最重要的一句是const int *pi

这句从右向左读作:pi是一个指向int类型的,被定义成const的对象的指针

这样的一种声明方式的作用是可以修改pi这个指针所指向的内存地址,却不能修改指向对象的值;

如果在代码后面添加*pi = 10; 这样的赋值操作是不被允许编译的。

 

void main(void)

{

 int a = 10;

 const int * const pi = &a;

cout << *pi << "|" << a <<endl;

}

上面最重要的一句是const int* const pi;

这句从右向左读作:pi是一个指向int类型对象的const 指针;

这样的一种声明方式的作用是你即不可以修改pi所指向的对象的内存地址,也不能利用指针的解引用方式修改对象的值,也就是*pi = 10这样的方式。

抱歉!评论已关闭.