只读”。
一、const的各种用法:
1、修饰变量
const int a/int const a:表示a是一个常量。
const int *a:表示a是一个指向常量的指针,*a是不能被修改的,但是a可以被修改。
int * const a:表示a是一个指向整数的常指针,a是不能被修改的,但是*a是可以被修改的。
const int * const a:表示a是一个指向常量的常指针,*a是不能被修改的,a也是不能被修改的。
2、在函数参数中使用const
传递过来的参数在函数内不能改变,与修饰变量性质一样。
void display(const int a,int b){a=5;}//错误。
3、const修饰成员函数
mutable修饰的变量除外)。
(2)加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用.const成员函数不能调用非onst成员函数,因为非const成员函数可能会修改成员变量。
void testConstFunction(int _x) const
{
x=_x;错误,在const成员函数中,不能修改任何类成员变量
modify_x(_x);错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
}
void modify_x(int _x)
{
x=_x;
}
只要类方法不修改调用对象,就应该将其申明为const。
4、const修饰函数返回值
若函数的返回值是指针,且用const修饰,则函数返回值指向的内容是常数,不可被修改,此返回值仅能赋值给const修饰的相同类型的指针。如果返回值是对象,要注意确定函数究竟是想返回一个对象的“copy”,还是仅返回对象的“别名”。
二、为什么要使用const:
给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。可以避免无意中由于修改数据造成的编程错误。
能够处理const和非const实参。
能产生更紧凑的代码。
三、const和#define的区别
const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。
#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。