Const关键字

Const关键字

Const意为常量、常数,在c++中,可以用来修饰变量、指针、类对象和函数,同时c++11还引入了constexpr,本文将对const的用法进行总结,并和constexpr对比。

Const的用法

const修饰变量或者类对象时,就是使变量或类对象中的成员变量不可修改。
const修饰指针通常有这三种写法:const int* p,int* const p,int const * p,三种写法非常相似,博主以前也经常忘记,后来记住了规律:const修饰自己左边的,如果左边没有可以修饰的,则修饰右边的。
这样一来三种写法就很容易知道答案:const int* p中,const修饰int,语义是p指向的变量不可改变;int* const p中,const修饰*,语义是p指向的地址不可改变;int const* p中,const修饰的是int,语义是p指向的变量不可改变。这样是不是就再也不会忘记了!
const修饰函数也有几种形式:

const int foo();
const int* foo()
const int& foo();
int foo() const;
int foo(const int a);
int foo(const int& a);

const int foo()中,const修饰的是返回值,但由于c++的函数返回的都是临时值,而const修饰的临时值在函数调用后就被销毁了,所以实际上这种写法没有任何意义。但我们可以使用指针传递或者引用传递的形式。引用传递的形式为const int& foo(),这样使用避免出现foo()=1这种写法修改返回值;指针传递的形式为const int* foo(),前面说过,const int使得值不可修改,返回的指针虽然被销毁了,但用于接收返回值的指针依然需要是const int形式的,保证返回指针指向的地址不可修改。
Int foo() const中,需要说明的是这种形式只能用于类的成员方法,普通函数不能使用这种写法。这种情况下const修饰的实际上是类实例的this指针,语义是在这个函数的执行过程中,保证this指针的成员变量不被修改。
Int foo(const int a)中,const修饰的是函数的参数,表示a在这个函数执行中不被修改,我们在c++程序中经常使用int foo(const int& a)这种写法,通过引用避免参数的拷贝,const避免参数在执行过程中被修改。

修改const

有时我们通过const修饰this指针,但又希望this指针中某几个成员变量可以被修改,这时可以用Mutable修饰希望被修改的成员变量,这样就可以修改了。
C++有四种类型转换,const_cast就是其中一种,作用是改变变量的const属性,需要注意的是const_cast传入的类型只能是引用或者指针。

const与constexpr的区别

constexpr修饰的是编译期就可以推导的常量表达式,变量必须在编译期就初始化,而const只是确保变量不被修改,可以在运行时再初始化。例如以下代码:

int a = 10;
const int b = a;(正确)
constexpr int b = a;(错误)

由于a不是常量,b并不是常量表达式,编译将报错。将a加上const修饰,则b为常量表达式,可以通过编译。

你可能感兴趣的:(linux,c++基础)