c++ 中的const

const总结

const int a 只能由const int & 引用来绑定,普通的int & 是无法绑定const值的。

左值和右值的概念
C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础。

左值与右值这两个概念是从 C 中传承而来的,左值指既能够出现在等号左边,也能出现在等号右边的变量;右值则是只能出现在等号右边的变量。

int a; // a 为左值
a = 3; // 3 为右值

左值是可寻址的变量,有持久性.
右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的
左值和右值主要的区别之一是左值可以被修改,而右值不能
const 引用可以初始化为不同类型的对象或者初始化为右值。如字面值常量。 而非const的一般引用只能绑定到相同类型的对象

int i = 42;
int &a = i; //这是普通的引用
const int &r = 42; // const 引用
const int &r2 = r + i; 

const引用可以绑定到普通的变量上,也可以绑定到const变量上,const 绑定的变量为只读

//这是正确的,非const引用可以修改
int a  = 0;
int &r = a;
r = r + 1; // 最后a = 1 and r = 1

// 这是错误的,因为const引用是只读的
int b = 0;
const int &r2 = b;
r2 = r2 + 1;

与其他变量不同,除非特别说明,==在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。==通过指定const变量为extern,就可以在整个程序中访问const对象。
注意:非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。

extern const int a = 5

如果函数需要传入一个指针,面试官可能会问是否需要为该指针加上const,把const加在指针不同的位置有什么区别;如果写的函数需要传入的参数是一个复杂类型的实例,面试官可能会问传入值参数或者引用参数有什么区别,什么时候需要为传入的引用参数加上const。 const是用来声明一个常量的,当你不想让一个值被改变时就用const,const int max和int const max 是没有区别的,都可以。不涉及到指针const很好理解。一旦涉及到指针,则比较容易出问题。

int b = 100;
const int *a = &b;   //[1]
int const *a = &b;	 //[2]
int* const a = &b;	//[3]
const int *const a = &b; // [4]

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向的对象为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量

因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值