const主要为了防止所修饰的变量再次被修改。一般在定义的时候初始化但const类的成员变量必须在构造函数的初始化列表中初始化。
以下是const的常见用法:
1,用于定义常量变量,这样这个变量在后面就不可以被修改
const int a = 9; a=8;//错误不能再被修改
2,保护函数参数不被改变
void foo(const int& val)
{
val = 10;//错误 val不能被改变
}
3,类中使用const修饰函数表示函数只读,不能修改非static的成员变量
class
{
public:
void fun() const //加const修饰
{
a = 10; //出错,不可修改非static变量
b = 10; //对,可以修改
}
private:
int a ;
static int b;
}
4,const修饰指针变量时
(1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。
(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。
(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。
const int *A; 或 int const *A; //const修饰指向的对象,A可变,A指向的对象不可变 int *const A; //const修饰指针A, A不可变,A指向的对象可变 const int *const A; //指针A和A指向的对象都不可变
5,修饰函数返回值,防止返回值被改变
const int fun();
接收返回值的变量也必须加const
const int a = fun(); //接收的变量也要是const的,int a = fun()是错误的,
6,修饰类的成员变量
使用const修饰的变量必须初始化,在类中又不能在定义时初始化,
如;
class { private: int a = 10; const int b = 10; static const int c = 10; //这样初始化都是错的, } 初始化const int类型(没有static),在类的构造函数上初始化 Class Test { Public: Test():b(23) //构造函数上初始化b的值为23 { } private: const int b ; } 初始化static const int这个类型的(带有static的),在类的外面初始化 class Test { private: static const int c; } const int Test::c=10; //类的外部初始化c为10
7,const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用,
class { private: int a = 10; const int b = 10; static const int c = 10; //这样初始化都是错的, } 初始化const int类型(没有static),在类的构造函数上初始化 Class Test { Public: Test():b(23) //构造函数上初始化b的值为23 { } private: const int b ; } 初始化static const int这个类型的(带有static的),在类的外面初始化 class Test { private: static const int c; } const int Test::c=10; //类的外部初始化c为10
非const变量默认为extern,要是const能被其他文件访问必须显示指定为extern
8, const 与 define的区别:
共同点:const和define都可以定义常量
区别: 1,const 不仅可以定义常量,还有强大的修饰功能。
2,const有数据类型,而define没有,编译器对前者具有安全类型检查,而后者只进行简单的替换。
3,编译器对const常量分配内存,而对宏不分配。
宏优点:宏不能可以定义常量,还可以定义表达式 。但表达式一定要带括号。可以让代码更为简洁。