const是不变的意思,在C++程序中,经常用const来限制对一个对象的操作:
1.1 const变量
例如: const int n=3; 则这个变量的值不能改变,即不能对变量赋值。
1.2 const参数
出现在函数参数中的const表示在函数体中不能对这个参数做修改。比如strcmp()函数用来比较两个字符串的大小,在函数体中不应该改变两个的参数的值,所以将它定义为是const的。const通常用来限制函数的指针参数、引用和数组参数,而一般形式的参数因为形式参数和实参本来就不在同一个内存空间,所以对形式参数的修改不影响实在参数,因此也没有必要限制函数不能对参数进行修改。
下面是一些使用函数const参数的例子:
(1)函数strcpy()将src字符串的内容复制到targ字符串中,为保证src字符串不被修改,将它定义问const参数:
void strcpy(const char* src,char * targ);
(2)函数max() 从数组array中找出具有最大值的数组元素并返回这个最大元素的值,为保证数组元素不会再函数中被修改,将它定义为const参数:
int max(const int array[] ,int size);
(3)函数outputOjbect()将类MyClass的对象obj的内容输出。对象定义为const引用,即可以保证对象不会在函数体中所改变,又可以节省对象传递的开销,如:
void outputObject(const MyClass & obj);
1.3 const 返回值
函数返回值为const只有用在函数返回为引用的情况。函数返回值引用常量表示不能将函数调用表达式作为左值使用。
例如:
int &min(int &i,int &j); 可以对函数调用进行赋值,因为它返回的是左值: min(a,b)=4;
但是,如果对函数的返回值限定为const的:
const int &min(int &i , int &j); 那么,就不能对min(a,b)调用进行赋值了。
1.4 const 函数
在学到类时,将会看到可以为类的成员函数进行如下形式的定义:
calss classname{
public :
int getMember() const;
private :
int member;
};
这里,在函数定义头后面加上的const表示这个函数是一个“只读函数”,函数不能改变类对象的状态,不能改变对象的成员变量的值。如在函数体中不能这么写:
classname::getMember()
{
member=4; //错误!不能修改成员变量的值
return member;
}
1.5 用const 来限制指针
1).指向常量的指针:
当const出现在指针定义的最开始时,表示定义了一个指向常量的指针。比如:
int i; const int ci=20;
const int * ip1=&ci; const int * ip2=&i;
这里定义了两个指向常量的指针,ip1和ip2。并且ip1初始化为指向一个常量ci,ip2初始化为指向一个变量i。
指向常量的指针的含义是:不能用过指针来间接修改指针所指向内存空间的值。比如上面的例子就不能通过*ip1来修改常量ci的值,也不能通过*ip2来修改变量i的值,所以下面的语句不正确:
*ip1=34; //错误! ip1是指向常量的指针
*ip2=54; //错误! ip12是指向常量的指针
在使用指向常量的指针时,应该注意以下几点:
a).指向常量的指针只限制指针的间接访问操作,而不会限制指针变量本身的操作。所以,可以改变指针本身的值。比如可以修改ip1和ip2的值:ip1=&i; ip2=&ci;
b).指向常量的指针只限制指针的间接访问的操作,但不会限制所指向的空间的操作。比如指针ip指向一个变量i:
int i; const int * ip=&i;
*ip=34; //错误! ip是指向常量的指针
i=56; //正确,i是一个变量
c).如果要给一个指针赋一个常量的地址,则这个地址必须定义成指向常量的指针。这样可以保证不会通过指针来间接修改常量的值。比如:
const int ci=30; //正确!
const int* ip1=&ci; //错误! 必须将ip2定义成指向常量的指针
ci是一个常量,如果要将它的地址赋值给一个指针,这个指针必须是一个指向常量的指针。所以不能将一个不指向常量的指针ip2指向常量ci.
2). 指针常量
在定义指针的时候,可以通过在指针名的前面加上const来将指针定义成常量,称为指针常量。和一般的常量一样,我们不能修改指针常量的值。即我们只能在定义指针时将它初始化为指向某个地方,不能再对指针赋值。下面是对指针常量的定义:
int i,j;
int * const ip=&i; //正确!定义指针常量ip,初始化为指向变量i
ip=&j; //错误!不能改变指向常量的值
注意,对指针变量的const限制并不影响对它所指向空间的操作。可以通过间接引用来操作符‘*’来修改指针所指向的空间值。例如上面定义的指针常量ip指向变量i,可以通过*ip来改变i 的值: *ip=32; //正确!
3). 指向常量的指针常量
如果将上面两个结合起啦,就可以定义指向常量的指针常量。下面定义了这么一个指针:
const int ci=93;
const int * const pi=&ci;
指向常量的指针常量必须在定义时初始化,它的使用也非常受限制,我们不能改变指针本身的值,也不能通过指针来间接改变指针,只能在程序中使用它们的值。
上面介绍了利用const来限定指针的三种情况。需要记住的是,指针本身和指针所指向的空间是两个不同的内存空间,所以需要对两者分别限定。