const 和 constexpr
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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变量均为常量,所以必须要
以上是关于const 和 constexpr的主要内容,如果未能解决你的问题,请参考以下文章
C++语言const_iterator和const iterator的区别,