const的用法有以下几种:
① 修饰全局变量时,表明它是一个常量,作用域在有static修饰的时候是本文件的作用域,如果没有static修饰的时候作用域是全局的;(与#define宏定义的区别: ⑴ const定义的常量需要进行静态类型安全检查,而#define定义的常量只是在编译预处理时期,直接进行文本替换,没有类型检查。⑵ 有些编译器可以对const定义的常量进行调试,而#define不会进行调试。⑶ const定义常量不会出现边际效应,而#define的边际效益经常发生);
② 修饰局部变量时,同①;只是作用域变成了函数局部变量了;
例子:
const int Asize =100;
const int data[] = {1,2,3,4,5};
const struct cir c1 = {1,2,3};
// 分别表示整型变量Asize、数组data以及结构体c1不能够再改变
③ 修饰指针
⑴ 将指针所指向的对象定义成常量但指针不是常量;[const没有越过*号]
const <类型> *指针名 = 初始值;
<类型> const *指针名 = 初始值;
[例子]
const char *pStr = "abcd"; 或者char const* pStr = "abcd"
pStr[2] = 'c'; //出错;
pStr = "cdef"; // OK
⑵ 将指针定义为常量而指针指向的对象不是常量; [const越过*号]
<类型> *const 指针名 = 初始值;
[例子]
Char * const pStr = "abcd";
pStr = "defa"; //出错
pStr[2] = 'd'; // OK
⑶ 将指针以及指针指向的对象都定义为常量; [*号两边都有const]
Const <类型> * const 指针名 = 初始值;
Const char * const pStr = "abcd";
pStr = "dewfe"; // 出错
pStr[2] = 'd'; // 出错
④ const修饰函数的形参
表明在该函数中不能够改变该参数的值;具体要试形参的类型类看,如果形参是基本类型的变量,那同const修饰变量的用法,如果形参是指针,那同const修饰指针的用法;
⑤ const修饰函数的返回值
主要用于防止用户将一个函数的返回值作为表达式的左值来使用;比如const char*strCopy(char *dest, const char *src); 函数返回一个const的指针,那么我就不能够这样用了 strCopy(pStr, "abd") = "abcd";//出错
⑥ 类常量成员函数
将const用来类的成员函数形参表()与函数体{}之间的const.[与类的成员函数返回const类型值区别];
主要表明该成员函数不能够修改调用该成员函数的对象的成员变量。[类常量成员函数不能够定义为static,即不能够定义为static int getX()cosnt{}; 因为static函数是属于类的,它能够修改的参数只有自己的形参、类的静态成员变量以及全局变量,而这三者都不属于一个类的对象的,所以一个类的常量成员函数没有必要定义为static,而定义为static时,编译器会报错]
比如:
class test {
public:
int getX()const {
return m_x;
}
private:
int m_x;
};