C++ const
一、作用
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;
char const *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 类型。