C++ const和constexpr详解

本文详细探讨了C++中的const和constexpr限定符。const用于限制变量的修改,主要应用包括初始化、指针和引用、函数参数及返回值、const成员函数与mutable关键字。constexpr则用于创建编译期常量,它可以用于变量、函数,确保在编译时计算。const与constexpr的主要区别在于const不限制运行时变化,而constexpr限定在编译期。

const 限定符

使用变量的好处是当我们觉得变量值不合适时可以随时调整,但是这也会带来弊端,比如容易无意间改变了它的值,为了避免这种情况,可以用关键字const对变量的类型加以限定。

初始化

const限定符定义的对象必须初始化。
指针和引用这篇博客中,我曾介绍了对于const 指针和const 引用的初始化方式。
其实const类型的对象能执行大部分非const类型对象的操作,只有对const类型的对象执行改变其内容的操作时,该限定符才起作用,不仅如此,如果利用一个对象去初始化另外一个对象,则它们是不是const都无所谓

int i = 10;
const int ci = i; //正确:i的值被拷贝给了ci
int j = ci; //正确:ci的值被拷贝给了j

拷贝一个对象的值并不会改变被拷贝对象的值,一旦拷贝完成,新的对象和被拷贝对象就是两个独立的对象

const修饰指针

顶层const:指针本身是个常量
低层const:指针所指向的对象是个常量或者引用绑定的对象是一个常量

  • 对于对象类型为基本数据类型情况,其const都是顶层const
class A {
   
   
public:
	int val;
};

int main()
{
   
   
	const int i = 10; 		//不能改变i的值,这是一个顶层const
	const double d = 1.2;	//不能改变d的值,这是一个顶层const
	const char c = 'a';		//不能改变c的值,这是一个顶层const
	const A object_A;		//不能改变object_A的值,这是一个顶层const
	return 0;
}
  • 对于对象类型是指针的情况,其对象即可以是顶层const,也可以是底层const
int i = 10;
int j = 20;
const int *p1 = &i;		//允许改变指针p1的值,即可以改变其指向,但不允许改变i的值,这是一个底层const
p1 = &j;				//使p1从指向i改为指向j
cout << *p1 << endl;	//输出j的值,20
int* const p2 = &i;		//允许改变i的值,但是不允许改变指针p2的值,这是一个顶层const
constconstexpr是C语言中用于定义常量的两个关键字。 const是一个修饰符,用于声明一个不可改变的常量。在C语言中,我们可以使用const来定义一个常量,一旦被定义后,就不能再改变其值。常量一般用大写字母表示,例如: ``` const int MAX_VALUE = 100; ``` 在上述代码中,MAX_VALUE被定义为一个常量,其值为100,这意味着在程序的其他地方不能再改变MAX_VALUE的值。 constexprC++11新增加的关键字,用于在编译时求得表达式的值,并将其作为一个常量。与const类似,constexpr也用于定义常量,但它的需求更加严格。在C++中,constexpr可以用于常量的定义、函数的参数返回值等。 constexpr的特点是在编译时求值,因此可以提高程序的运行效率。例如: ``` constexpr int square(int x) { return x * x; } int main() { constexpr int num = 5; constexpr int result = square(num); return 0; } ``` 在上述代码中,我们定义了一个constexpr函数square,它接收一个参数x,并返回x的平方。在main函数中,我们使用constexpr定义了一个常量num,并将它作为square函数的参数,得到了一个常量result。 总结来说,constconstexpr都是用于定义常量的关键字。const适用于C语言,用于声明不可改变的常量;constexpr适用于C++11及以后的版本,用于在编译时求得表达式的值,并将其作为一个常量。在实际的开发中,根据具体的需求来选择使用const还是constexpr
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倒地不起的土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值