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;
}