const 和 constexpr

在C++中,const 这个关键字用法非常灵活,导致我总会搞不清作用是干啥的。灵活使用const会大大改善程序。

const 是C++的一种类型修饰符,是不可改变的不能被更新的。

1.const 修饰成员变量

  const int a = 1;  此时的a在后面的操作中不能被改变,否则会报错

2.const 修饰函数参数

  (1)void f( const int i ){}    防止意外的修改,增强程序的健壮性,同样在函数内不能被修改

  

  (2)void f(const int* i){}  指针所指的内容为常量不可变

  

  (3)void f(int* const i){}  指针本身为常量不可变

  

  (4)void f(const int& i){}  引用参数在函数内不可以改变

3.const 与指针搭配

  (1)int* const a;  指针本身是常量不可变

  (2)const int* a;  指针指向的内容是常量,不可变

  (3)const int* const a;  两者都不能改变

区别的方法:

  以*为分割线,如果 const 位于 * 的左侧,那么那个const就是用来修饰指针所指向的变量,也就是指针为常量。

  const 位于*右侧的时候,const 就是修饰指针本身,也就是指针本身是常量

4.const 修饰函数的返回值

  (1) const int f(){}  返回的参数是常量(没有什么意义,因为返回的参数本来就是常量)

  (2)const int * f() {}  调用的时候相当于 const int *p = f();  即指针内容不可变

  (3)int* const f(){}  调用的时候相当于 int * const p = f();  指针本身不可变

5.在类中的运用

  (1)修饰成员变量  就是不能被修改,只能在初始化列表中赋值

  (2)修饰成员函数

class MyClass
{
...
void a()const{}  //常成员函数,不改变对象的成员变量(不能修改任何成员变量)

        //在这个函数中,不能调用非const 成员函数,因为非const 成员函数可能会修改成员变量
};

  (3)修饰对象

  const 修饰的类对象中,表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样的。

  还有const 修饰的对象只能调用const 修饰的成员函数,因为非const修饰的函数都有可能修改成员变量。

5.将const 类型转化为非const 类型

方法:采用const_cast 进行转换

即 const_cast<type_id> (expression)

常量指针被转化成非常量指针,并且仍然指向原来的对象;

常量引用被转换成非常量引用,并且仍然指向原来的对象;

常量对象被转换成非常量对象。

6.constexpr

constexpr是C++11中增加的关键字,他的意思是“常量表达式”,在编译期可求值的表达式。

(1)constexpr变量必须在编译的时候进行初始化。所有的constexpr变量均为常量,所以修饰的变量必须要是在编译期可求值的。

(2)与const 不同,constexpr申明中如果定义了一个指针,限定符constexpr仅仅对指针有效,与指针所指的对象无关。

原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/7881463.html