我是靠谱客的博主 孤独电脑,最近开发中收集的这篇文章主要介绍const 用法总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  在编程中我们常常会使用敞亮的概念,除了使用#define定义的宏之外,我们还有更好的选择,就是使用const关键字。

  1.const关键字的意义

  当我们定义一个变量,并且希望这个变量不再改变(编译器会做出优化),通常就会使用const限定符。

1
const int i = 3;//定义i==3的int常量i
2
i = 4;
//非法操作,i是场量,值不可以更改

  定义一个常量时,必须对他初始化

1 const int i;

  这样的定义就是非法的,不符合c++标准。编译器会报错。

  2.const 常量在文件内有效

  c++中,如果程序包含多个文件,而每个文件都需要使用某个const对象,c++ 规定需要在声明和定义是都加上‘extern’关键字

  

 1 1.c:
 2
 3 #include <stdio.h>
 4 extern const int i;
 5
 6 int main()
 7 {
 8
printf("%dn",i);
 9 }
10
11 2.c :
12
13 extern int i =3;

  对上边两个文件分别用gcc和g++进行编译,结果gcc发出了一条警告,说i变量已被初始化,却又加上extern。可见c语言并不吃这一套。

 

  3 .const和 引用

  一般来说,应用类型必须和所引用的对象类型一致,但是const引用却是例外:

double value = 1.23;
const int &cval = value;//合法

这里有一个转换的过程,其实cval引用绑定在一个临时的变量上。编译器是这么处理的:

1 const int tmp = value;// 隐式转换
2 const int &cval = tmp;

  4.const和指针

  关于顶层const,和底层const的区别:

1 int i=3;
2 const int* p = &i;// 不可以通过p指针修改i的值,底层const 
3 int* const p = &i;//p的值不可以修改,顶层const

  简而言之靠右的是顶层const,靠左的是底层const。

 

  5.const和编译器优化

  c++编译器往往会对const对象进行优化,编译器会把出现const对象的地方直接用常量值代替。

 1 #include <iostream>
 2 using namespace std;
 3
 4 int main()
 5 {
 6
const int i =3;
 7
int* p = const_cast<int*>(&i);
 8
*p=4;
 9
cout << i << endl;
10 }

  于是第9行 会被编译器 处理为 cout<< 3<< endl; 输出结果也就是3了。

  但是我们可以使用volatile关键字通知c++编译器,我们的const对象的值是可以发生变化的,于是编译器就会很识趣的不再为你做出替代const对象的优化。

 1 #include <iostream>
 2 using namespace std;
 3
 4 int main()
 5 {
 6
volatile const int i =3;
 7
int* p = const_cast<int*>(&i);
 8
*p=4;
 9
cout << i << endl;
10 }

  于是输出结果就像意料的那样是4了。

 

  6.const和typedef

  当typedef给一个复合类型取别名时,用const对这个别名进行修饰时,const是对给定类型进行修饰,而不可以理解为简单的替换。 

1 typedef int* pint;
2 int i=3;
3 const pint p1 = &i;
4 p1 = NULL;//非法,p1是常量指针
5 *p1 =4 ;// 合法的,因为i的值不是const的

  pint是int* 的别名,是一个指向int的指针,因为const修饰的是类型,所以p1是一个 const指针。也就是 int* const p1,如果直接替换的话,就变成了const int* p1,顶层const变成了底层const,显然相去甚远!

转载于:https://www.cnblogs.com/ittinybird/p/4424948.html

最后

以上就是孤独电脑为你收集整理的const 用法总结的全部内容,希望文章能够帮你解决const 用法总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部