C++中的const应用的很灵活,const也大大改善程序的健壮性,下面就const在C++中的各种用法,做一个总结
const的使用地方
1.定义常量
(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的
TYPE const ValueName = value;
const TYPE ValueName = value;
在定义一个变量时用了const,就是常量了,在之后不能改变其值。
有的时候需要使用const变量,他的初始值不是一个常量表达式,但又确实有必要在文件中共享,这种情况下我们不希望编译器为每一个文件分别生成独立的变量,相反的,我们希望这类const对象像其他(非常量)对象一样工作,也就是说,只要在一个文件中定义了const,而在其他的文件中声明并使用它。
解决的办法是:对于const变量不管是申明还是定义都加extern关键字,定义一次就可以了
extern const int bufSize = fcn() //一个文件中
extern const int bufSize //和上面定义的bufSize是同一个
注意:默认状态下,const对象仅在文件内有效
const对象在定义时必须初始化,因为const对象在创建后就不能更改它的值
2、指针使用CONST
(1)指针本身是常量不可变
char* const p;
这个用const来修饰p,说明指针本身定为常量,常量指针必须初始化,而且一旦初始化,则它的值(也就是存放在指针里的地址)就不再改变的了
(2)指针所指向的内容是常量不可变
const char *p;
(3)两者都不可变
const char* const p;
顶层const和底层const
顶层const表示指针本身是个常量
底层const表示指针所指的对象是一个常量
int i= 0
int *const p1 = &i //不能改变p1的值,是顶层const
const int ci = 42 //不能改变ci的值,是顶层const
const int *p2 = &ci //能改变p2的值,是底层const
(4)还有其中区别方法,沿着*号划一条线:
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
3.const修饰函数系列
1)const修饰函数参数
传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样
void testModifyConst(const int _x) {
_x=5; ///编译出错
}
2).const修饰成员函数
(1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)
(2)const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
#include <iostream>
using namespace std;
class Point{
public :
Point(int _x):x(_x){}
void testConstFunction(int _x) const{
///错误,在const成员函数中,不能修改任何类成员变量
x=_x;
///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
modify_x(_x);
}
void modify_x(int _x){
x=_x;
}
int x;
};
3).const修饰函数返回值
(1)指针传递
如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改
const int * mallocA(){ ///const data,non-const pointer
int *a=new int(2);
return a;
}
int main()
{
const int *a = mallocA();
///int *b = mallocA(); ///编译错误
return 0;
}