c++ const

来源:互联网 发布:贪吃枫淘宝店 编辑:程序博客网 时间:2024/06/06 09:45

一、作用

     const是类型修饰符,经常用const来限制对一个对象或变量的操作,使用类型修饰符const说明的类型称为常类型,常类型的变量或对象的值是不能被更新的。const的用法很灵活,使用const将大大改善程序的健壮性。

二、用法

1.const常量

const int NUM=100;

int const NUM=100;

以上两者一样,NUM不能被修改,且在声明时必须初始化。若为外部的,则可以不初始化。

2.const指针

(1)指针常量:指针本身是常量不可变,但指针指向的内容可变。
     char*  const  pContent;
(2)常量指针:指针所指向的内容不可通过这个指针改变,可以通过原来的声明修改指针本身可变。
     const  char* pContent; 

charconst *pContent; 

两者一样。

(3)指向常量的指针变量:两者都不可变。
     const char* const pContent; 
(4)区别方法:
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,就表明声明的指针是一个常量

3.const函数参数

      出现在函数参数中的const表示在函数体中不能对这个参数做修改。const通常用来限制函数的指针参数、引用和数组参数,而一般形式的参数因为形式参数和实参本来就不在同一个内存空间,所以对形式参数的修改不影响实在参数,因此也没有必要限制函数不能对参数进行修改。

例如:

(1)void function(const int Var);

void function(char* const Var);

以上两者const无意义,本身就是形参。

(2)函数strcpy()将src字符串的内容复制到targ字符串中,为保证src字符串不被修改,将它定义问const参数:

void strcpy(const char* src,char * targ);

      (3)函数max() 从数组array中找出具有最大值的数组元素并返回这个最大元素的值,为保证数组元素不会再函数中被修改,将它定义为const参数:int max(const int array[] ,int size);

      (4)函数outputOjbect()将类MyClass的对象obj的内容输出。对象定义为const引用,即可以保证对象不会在函数体中所改变,又可以节省对象传递的开销(若按值传递会产生对象的副本):void outputObject(const MyClass & obj);

4.const函数返回值

       const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。因为返回实例只能访问类中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。

5.const类成员变量

只能在初始化列表中赋值。

 class A
    { 
        …
        const int nValue;        
 //成员常量不能被修改
        …
        A(int x): nValue(x) { } ;
 //只能在初始化列表中赋值
     

6.const类成员函数

const修饰类的成员函数,则该成员函数不能调用类中非const成员函数。一般写在函数的最后来修饰。
    class A
    { 
        …
       void function()const; //常成员函数, 它不改变对象的成员变量.
也不能调用类中任何非const成员函数。

    }

a. const成员函数不被允许修改它所在对象的任何一个数据成员。

b. const成员函数能够访问对象的const成员,而其他成员函数不可以。

c.const修饰类对象/对象指针/对象引用

 const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

 const修饰的对象/指针/引用,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
例如:

class AAA

    void func1(); 
    void func2() const; 

const AAA aObj; 
aObj.func1(); ×
aObj.func2(); 
正确

const AAA* aObj = new AAA(); 
aObj-> func1(); 
×
aObj-> func2(); 
正确

三、使用const的建议

要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

不要轻易的将函数的返回值类型定为const,除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

任何不会修改数据成员的函数都应该声明为const 类型。


0 0
原创粉丝点击