C++基础--const限定符

认识const限定符

        如果我们需要定义一个变量,并且知晓该变量的值在使用的过程中不应该被修改。为了警惕程序不小心修改了这个值,我们可以使用关键字const来对该变量加以限定,使其无法被直接修改。

	const int num = 10;   //num被声明为一个常变量
	num = 20;   //错误,num无法被修改

         同时注意,const修饰的变量由于无法被修改值,所以必须要初始化否则会出错。

const int b;  //错误,b没有初始化

const与extern关键字

         注意,在默认的情况下,const对象被设定在仅在本文件内有效,const修饰的全局变量在其他的文件中也是不可见的,当在多个文件中使用同名的const变量时,其实是在不同的文件中定义了独立的变量。

        如果我们希望在一个文件中定义const变量,而可以在其他的文件中去使用它,则可以使用extern关键字来修饰。只需要在变量的声明和定义都加上extern修饰符,就可以使其在其他的文件中可以使用。

const与引用

        对于const对象,我们依旧可以使用引用来绑定它,我们习惯称为常量引用。其与普通的引用不同的是,常量引用也不能修改它所绑定的对象。同时我们无法用非常量引用绑定一个常量对象。

	const int num = 10;
	const int& n = num;  //常量引用
	n = 20;   //错误,常量引用也无法修改其绑定的对象
	int& n2 = num;  //错误,无法用非常量引用绑定一个常量对象

        一般情况下,引用的类型必须与其所引用的对象要保持一致。但是,对于常量引用来说,它可以绑定任意可以表达式作为初始值,只要该表达式的结果能转化为该引用的类型即可,此时,我们不能通过这个引用来修改对象的值。

	int num = 10;
	double num2 = 3.14;
	int& n = 10;  //错误
	const int& n1 = 10;  //正确
	const int& n2 = num;
	const int& n3 = num2;

指针和const

        对于指针,我们同样可以使其指向一个常量。与其他用const修饰的成分一样,指向常量的指针无法修改其指向对象的值,同时,只有通过指向常量的指针,才能够来存储常量。

	const int n = 10;
	int* p1 = &n;   //错误,无法使用普通指针去指向常量
	const int* p2 = &n;
	*p2 = 20;  //错误,指向常量的指针无法修改其所指向的值

         与引用类似,虽然一般情况下,指针的类型必须和其所指向的类型相同,但是此时会存在一种特例。用于指向常量的指针同时也可以指向非常量,但是此时,虽然这个变量本身是可以修改的,我们也依旧不能通过这个指针去修改它。

	int n = 10;
	const int* p = &n;
	*p = 20;   //错误,不能通过指向常量的指针去修改变量的值

        同时,指针本身也是一个对象,同样也可以被const修饰,我们称为常量指针,注意此时的写法int *const p. 值得注意的是,用const来修饰指针本身,和指向常量的指针是有着巨大区别的,指针被const修饰之后并不意味着该指针失去了修改其对象的值的能力(由所指对象的类型决定),而是指针本身的指向无法修改。因此,由于我们不能修改指针的指向,我们的指针必须初始化。

	int n = 10;
	int n2 = 20;
	int* const p1 = &n;
	int* const p2;   //错误,常量指针必须初始化
	*p1 = 30;
	p1 = &n2;  //错误,常量指针无法修改其指向

顶层const与底层const

        刚刚我们已经了解到,指针由于本身是一个对象,其又可以指向一个对象,所以指针本身用const修饰和指针所指的对象被const修饰就会出现区别。对于前者,我们称之为顶层const,后者则成为底层const。 对于更一般的const来说,顶层的const表示其对象本身为常量,底层const只与指针和引用有关,因为引用本身并不是对象,所以修饰引用的const都为底层const。

	int m = 20;
	const int n = 10;  //顶层const
	const int* p = &n;  //底层const
	int* const p2 = &m;  //顶层const
	const int& r = n;   //底层const
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值