C/C++ const 修饰符用法解析

先说const修饰变量和指针的情况:

const int i=10;

int const i=10; 

 这里说明i 是一个常量,不可对 i 进行赋值操作了。如:i=11;

const int *p ;

int const *p; 

这里说明p指向的对象是常量,不可以通过p 修改其值,如:*p=20; p 的值是可以修改的,int k=9; p=&k; 这个是合法的。

int * const p;

说明 p 是一个常指针,它只能指向一个特定的对象,不能指向其它的对象,如:int k=9,int j=0;  int *const p=&k; p=&j;这里是不合法的。但执行*p=j 是合法的。

const int * const p,这说明p 是一个常指针,p 所指向的对象是一个常对象。不仅p的值不能更改,p所指对象的值也不能通过 *p更改。如: int k=9,int j=0;  const int *const p=&k; p=&j;这里是不合法的。但执行*p=j 是不合法的。

 

const 修饰函数参数:

     在函数体内部不能修改改参数的值。

const 修饰变量时:

     可以把const 修饰的变量赋值给其它变量,但反之则不行。

const 修饰引用时:

     说明该引用为常引用,不能通过该引用修改原来变量的值。

const 修饰函数的返回类型时:

     限定该函数的返回值是个常量

const 用于类的成员函数时:

    作用是不允许该成员函数修改对象的数据成员,此成员函数只能访问类中的常成员函数,不能对类中的数据成员进行修改,只能进行读取。

const 修饰对象时:

    常对象只能调用常成员函数,不能调用非常函数。

    非常对象,既可以调用常成员函数也可以调用非常成员函数。

以下例子加以说明:

#include <string>

using namespace std;

class Test

{

private:

    const int A;

    int B;

public:

    Test(int a,int b):A(a),B(b){}//常数据成员,只能在初始化列表中进行初使化。

    void set(int a);

    void showData();

    void show() const;

};

void Test::set(int b)

{

    B=b;

    //A=10; //常数据成员,不能通过成员函数进行赋值操作。

}

void Test::show() const

{

    cout<<"const function:A="<<A<<",B="<<B<<endl;

    //showData();//这里是非法的,常函数只能调用常函数,不能调用普通函数。

}

void Test::showData()

{

    //show();//这里是允许的,普通函数可以调用常成员函数。

    cout<<"no_const function:A="<<A<<",B="<<B<<endl;

}

int main()

{

    Test test(0,10);

    const Test test1(1,11);

    test.show();

    test.showData();

    test1.show();

   // test1.showData();//这一句是非法的,常对象只能调用常成员函数。

    return 0;

}