const 不再迷茫

博客地址:http://blog.csdn.net/jiangxinnju

github:https://github.com/jiangxincode

首先说明一下const在C和C++中的主要用法,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰变量、函数的参数、返回值,甚至函数的定义体。

const修饰变量

const修饰变量通常用于定义符号常量。我们过去一般使用宏定义的方式定义符号常量,比如:

#define PI3.1415926

其实我们也可以使用const方式定义符号常量,下面的语句与上面宏定义的方式达到的效果相似。

const double PI3.1415926

那两者有什么区别呢?在使用宏定义的方式时,首先在预处理过程中将源程序中的常量名全部替换成对应的字面常量,然后对替换过的源程序进行编译。相比较之下const方式不涉及预处理过程,它只在编译工程中起作用。因为宏定义方式定义的符号常量没有类型,所以不能进行严格的类型检查,而const则可以,并且有些调试工具可以对const常量进行调试,而不能对宏常量进行调试。但这也不是说宏常量就比const常量差,比如你能够利用const常量实现下面的宏定义功能么?

#ifndefJIANGXIN_H

#defineJIANGXIN_H

#endef

而且由于历史原因,实际上使用宏常量的情况远远大于const常量,特别是在纯C编程环境中。不过在C++编程环境中,我还是推荐你使用const,因为这更加安全。同时时刻记住一句话,const常量作用与编译期,宏常量作用于预编译期,当你遇到一些令人迷惑的问题时想想这句话,或许能够有所收获。

现在举几个例子:

const int m = 0; //其实我们通常把const符号常量叫做const常量,以便和宏常量区分

typedef char * pStr; //新的类型pStr,代表一个指向char的指针类型。

char string[4] = "abc";

const char *p1 = string;//p1是一个指针,指向一个const
char类型

p1++; //正确,p1本身不是常量,它指向一个常量

const pStr p2 = string; //p2是一个常量指针,这个指针指向一个char类型变量

p2++; //错误,p2是一个常量指针

char *const p3 = string; //p3同p2相同,是一个常量指针

char const* p4 = string; //p4同p1相同,是一个指向const
char的指针,只能用于C中,在C++中只能使用const
char *p4 = string;

const修饰函数形参

函数形参主要包括传值型参数,传指针型参数,传引用型参数。

对于传指针和传引用型参数,如果我们怕在该函数中错误的改变实参的值,一般都会加上const来修饰形参。

对于传值型参数,我们一般不会使用const修饰,因为完全没有必要,你是不是用const,都不能改变实参的值,因为传值型形参是在栈中分配的,函数调用之后一定会销毁。例如:void
Fun(int n)和void Fun(const int n)没有任何区别,而且还是代码更加晦涩,所以不推荐。但是有一种情况需要考虑,如果你需要传递一个比较复杂的类类型,但是你又不需要改变该类的对象,这时你可以将传值改为传指针或者引用,同时用const修饰。这样的话就避免了构造临时对象的开销。比如加入A是一个很复杂的类类型,这是使用void
Fun(const A &a)要比void Fun(A a)效率更高。

用const修饰函数的返回值

函数的返回值与形参类似,也包括返回值类型,返回指针类型,返回引用类型。

对于返回值类型为指针或者引用的情况,如果我们不希望其被修改,可以使用const对返回值进行限定。此时该返回值const修饰的同类型const指针(返回值为指针)或者同类型的const变量(返回值为引用,且该值为基本类型或者定义了拷贝构造函数、拷贝赋值运算符的类型)。如对于:

const char * Fun(void);

如下语句将出现编译错误:

char *str = Fun();//cannotconvert from ‘const char *‘ to ‘char *‘;

正确的用法是:

const char *str= Fun();

如果返回值类型为值类型,由于函数会把返回值复制到外部函数的存储单元中,加const修饰没有任何价值,所以不要把函数int
Fun(void) 写成const int Fun(void)。但是在某些情况下将值类型改为引用类型或者指针类型可以提高效率,可用不用const就看你要不要改变它们了。

const修饰成员函数

const关键字可以放在函数声明的尾部,表示该类成员不修改对象。注意const只能修饰类的成员函数,不能修饰普通函数,无论是C还是C++。

时间: 2024-10-19 17:21:17

const 不再迷茫的相关文章

2019思维最清晰的java学习路线图,看懂后学习java不再迷茫

笔者做java开发也有几年了,现在回想自己学习java的经历,当时真希望有一部大体的学习框架,这样自己就不会走许多弯路了,这是我在这三年工作和多年学习中的经验,希望对迷茫的java爱好者有所帮助:第一步 首先要做好学习前的准备工作:java语言一般用于大型的服务器程序开发,所有有必要了解如下内容:Unix开发环境Unix系统原理.Unix开发环境.Unix常用命令.熟练掌握Unix常用命令:熟练构建下的Java开发环境. 第二步 然后进入Java语言基础的学习阶段,学习任何一门语言都要打好基础,

【分享】不知道怎么学java?java学习路线送上!让你不再迷茫!

学习Java之前,先别急,静下心来好好想想:1)你对学习Java是否有兴趣?2)你是否能静下心来坚持不懈地学习?嗯,这是个容易但又绝对不应该忽略的问题,你确信自己对Java感兴趣.而且又有吃苦的准备,那你才可能学好Java!如果具备这两点条件,就请继续往下看(帖子后面我会分享一些java学习教程)Java体系涉及到三个方面:J2SE,J2EE,J2ME(KJAVA).(1)J2SE--Java 2 Platform Standard Edition,即JDK,它是三者的基础,属于桌面级应用开发:

慕课网因为有你,让我不再迷茫

我们相识在手机.是你,给了我精彩:是你,给了我信心:是你,让我懂得了开发……回往每走过的脚印,都会有你那深深的烙印,都会有你那充满爱意的眼神.现在也就只有你和香烟以我不离不弃了........................................ ................................ ........................ ....................................

程序员你为什么迷茫?

你曾经充满热情,是一位开源软件倡导者,你崇尚全栈工程师才有未来的理念,你渴望改变世界.但是现在你每天都处于焦虑之中,你每天不断地学习各种技术Kotlin.Swift.React Native.RxJava.hybrid思想等等等各种新技术,只有你在微博转发各种新技术文章的时候你才稍微轻松一些,这样会让你觉得不至于被快速发展的技术抛到后头. 你开始在知乎上提问: “意识到了自己没有办法成为 top 1% 的程序员,还应该选择程序员的道路么?” “作为一个帝都码农,现在的处境很迷茫,不知道未来在哪里

迷茫在路口——致我的2014

今天是2015年一月一日,2014年已经过去了.这意味着再过六个月整,我就要大学毕业,开始为自己的未来拼搏.这一年,我过的充实且迷茫.说2014充实,是因为我从寒假结束到有一个寒假的到来,几乎没有怎么闲下来,包括暑假:说2014迷茫,是因为我在大四学生工作.考研.出国的洪流中不知所措,终于定下来的方向又被家人坚决的否定. 我刚进入大学时,也算是一个有志青年,怀揣着出国留学的梦想.然而没人管束的我却松松散散,无拘无束的度过了将近三年大学生活,丝毫没怎么过问出国留学的事情,因为在我看来时间还充裕的很

迷茫的未来,我们需要做些什么来面对呢?

突然不知道从哪天开始,就对未来迷茫的很,不知道自己能干什么,也不知道自己会什么.也就在最近的某天里,我买了这么多年来从没有独自买过的那么多书,这是否是想通过买书来假装让自己不对未来迷茫?不得而知.不过从这一天起,我决定将自己所学所悟,都将转化为文字,来记录自己的生活,也希望通过这种方式来让自己的未来不再迷茫.将知识都写出来,将话都说出来,记录下来,作为一个记忆路线,让自己摸索着前进,我并不是奢求什么,从没有什么奢求,如果说真有什么奢求,那可能就是对未来的向往吧. 其实在这天之前,我一直都有这方面

二分怎么写

主要参考这个https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/讲的非常仔细. 以前做题的时候,经常遇到一些二分的题目,但是对边界条件,主要是加一还是减一,把握的不是很准确,后来看到别人推荐的上面的链接,终于不再迷茫了. 这里需要注意几点: 1.一般二分的情况,准确寻找一个数,求满足条件的最大值,求满足条件的最小值.尤其注意求满足条件的最大值,防止进入死循环,需要进行2个数的情况

2017工作计划

看了博友发表的一篇2017年计划之后,发现自己也应该列下计划,2017不能再碌碌无为. 1.巩固java基础,对语言要有自己的一些见解. 2.学习三大框架,通过项目进行实践,不能浮于表面. 3.算法学习从头开始. 4.如果没有新的项目,应该把之前的两个小项目进行代码重构. 5.选择最优,而不是将就. 6.在自身的运维工作中提出一些建设性的建议,提升所运维系统的稳定性.可靠性.易用性以及乐用性. 7.读20本书. 8.找到自身的定位,不再迷茫. 记2017年1月25日22:30分 柠檬人.

不骄不躁,努力前行

      你的梦想,你忘记了吗?    现在的自己还差的很远,现在的自己远远不是我想要的,那么你就要去改变啊,那你就要加油啊.找回那个自信的你,找回那个努力的你.用事实说话,靠本事吃饭.因为没有人会同情一个弱者,永远不会. 只有你努力了,只有你到了有那么一点点成就的那一天,你才不会愧对自己,愧对父母啊. 永远不要忘了,自己想要什么,自己想要成为什么样子的人!!!    虽然现在遇到了很多困难,虽然现在的处境很少有人可以理解,虽然自己的内心几度崩溃.可是,这又如何呢?什么事情都不是一蹴而就的,不