[收藏]C++ Tips(1)--const -程序员宅基地

技术标签: c++  语言  编译器  c  string  

[收藏]C++ Tips(1)--const<script language="javascript" type="text/javascript"> document.title="[收藏]C++ Tips(1)--const - "+document.title </script>
/*这一系列文章《C++ Tips》是公司Code Committee专家会推荐工程师看的,感觉很好,拿出来与大家共同提高。并不认为知道多少会使人与人产生差别,真正的差别在于你能做到多少。
--coofucoo
*/
有的Code Committee专家会建议你使用const:
1 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
2 要避免最一般的赋值操作错误,如将const变量赋值;
3 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
4 const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
5 不要轻易的将函数的返回值类型定为const;
6 除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
 
 
  const基本解释
 
  const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
 
  虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。
 
  问题:const变量 & 常
 
  为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?
 
  const int n = 5;
 
  int a[n];
 
  答案与分析:
 
  1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。
 
  2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。
 
  3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
 
  问题:const变量 & const 限定的内容
 
  下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?
 
  typedef char * pStr;
 
  char string[4] = "abc";
 
  const char *p1 = string;
 
  const pStr p2 = string;
 
  p1++;
 
  p2++;
 
  答案与分析:
 
  问题出在p2++上。
 
  1)、const使用的基本形式: const char m;
 
  限定m不可变。
 
  2)、替换1式中的m, const char *pm;
 
  限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。
 
  3)、替换1式char, const newType m;
 
  限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。
 
  问题:const变量 & 字符串常量
 
  请问下面的代码有什么问题?
 
  char *p = "i'm hungry!";
 
  p[0]= 'I';
 
  答案与分析:
 
  上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。
 
  问题:const变量 & 字符串常量2
 
  请问char a[3] = "abc" 合法吗?使用它有什么隐患?
 
  答案与分析:
 
  在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为“abc”,,注意,它没有通常的字符串终止符'/0',因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。
 
  问题:const & 指针
 
  类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?
 
  1)、const在前面
 
  const int nValue; //nValue是const
 
  const char *pContent; //*pContent是const, pContent可变
 
  const (char *) pContent;//pContent是const,*pContent可变
 
  char* const pContent; //pContent是const,*pContent可变
 
  const char* const pContent; //pContent和*pContent都是const
 
  2)、const在后面,与上面的声明对等
 
  int const nValue; // nValue是const
 
  char const * pContent;// *pContent是const, pContent可变
 
  (char *) const pContent;//pContent是const,*pContent可变
 
  char* const pContent;// pContent是const,*pContent可变
 
  char const* const pContent;// pContent和*pContent都是const
 
  答案与分析:
 
  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下判断原则 沿着*号划一条线,const和谁在一边,那么谁就是const,即const限定的元素就是它。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
 
  另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这里限定指针是const。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=480980

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ascmvi/article/details/524871

智能推荐

基于最小二乘、迭代和相位梯度校正的解包裹算法实例分析_精确最小二乘法解相位包裹-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏7次。基于最小二乘、迭代和相位梯度校正的解包裹算法(CPILSI)实例_精确最小二乘法解相位包裹

python中easy_install 卸载已经安装的包_mac 卸载easy_install-程序员宅基地

文章浏览阅读2k次。用easy_install安装Python的包很方便,在mac下有时还必须要用macports来安装python的包,这个时候就会产生冲突。我保留macports的python版本,要看用的是哪个python版本,可以用which命令which python/opt/local/bin/python说明用的是macports安装的python,如果显示的是/usr 下面的,说明_mac 卸载easy_install

Unity urp2d ShaderGraph 实现一个黑白转彩色的场景渐变效果 设计思路_unity渐变shader-程序员宅基地

文章浏览阅读3.4k次,点赞11次,收藏22次。那只能走走别的方向了,仔细想想,原来的shader也确实不太完美,因为我们要的是整个画面的黑白,而上面的shader则需要给每个场景物品都安装这个shader跑计算的话,无疑是降低了性能和扩展性的。我们可以放弃if节点,改用lerp在两个色域中做插值,就可以优化渐变效果,插值需要一个0-1的参数,我们选择使用“Saturate”节点,这个节点可以将一个浮点值映射到[0,1]的范围内,即输入大于1时=1,输入小于0时等于0,然后将结果连接到Lerp节点就可以了。这样我们这个效果就成功实现了。_unity渐变shader

Zookeeper、Dubbo面试题总结_下列有关zookeeper的说法不正确的是? 一个分布式的,开放源码的分布式应用程序协调-程序员宅基地

文章浏览阅读205次。【zookeeper面试】ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。1、zookeeper是一个开源的分布式协调服务框架。2、应用场景:分布式通知/协调、负载均衡、配置中心..._下列有关zookeeper的说法不正确的是? 一个分布式的,开放源码的分布式应用程序协调

Zillow“炒房”失败,算法神话破灭了吗?-程序员宅基地

文章浏览阅读1.3k次。新冠时代,裁员、失业在全球范围内都是高频事件,我们似乎早就已经习惯了各种黑天鹅消息。不过美国地产平台Zillow在年底彻底关停iBuying业务,并将该业务约2000名员工全部裁掉的消息,...

navicat创建表不显示问题解决-程序员宅基地

文章浏览阅读5.1k次。在创建数据表时,我们会发现navicat创建表不显示问题?以下有三种解决方法!

随便推点

【物联网】思科扔下数颗物联网重磅炸弹,中国IoT圈却选择集体视而不见!_cisco kinetic和jasper-程序员宅基地

文章浏览阅读1.4k次。来源: 物联网智库 原创 作者:物女王 就在前几天,一年一度的Cisco Live 2017用户大会上,思科发布了其10年来最具颠覆性的创新,说是开启了IoT的新时代都不为过,但国内物联网圈却选择集体视而不见,眼睁睁地与里程碑式的革新擦肩而过。随着数据量、连接性、计算能力的迅速提高,人工智能、增强现实和机器人技术的持续迭代,想要充分实现投资回报,有效利用物联网产生的数据,企业越来越需要一种能够统一_cisco kinetic和jasper

c语言与编程语言的区别,C语言与其他编程语言的区别-程序员宅基地

文章浏览阅读5k次。答案:C语言 主要因为它具有强大的功能。许多著名的系统软件, 如PC-DOS,DBASE Ⅳ都是由C语言编写的。用C语言加上一些汇编语言子程序, 就更能显示C语言的优势了。归纳起来C语言具有下列特点:1. C是中级语言它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。2. C是结构式语言结构式语言的显著特点是...

jocky混淆JAVA代码(保护你的JAVA项目)_ide 混淆编写的java-程序员宅基地

文章浏览阅读592次。一、前言1.1 什么是Jocky? 我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来_ide 混淆编写的java

vue-cli3 npm run build报错 ,resolve is not defined-程序员宅基地

文章浏览阅读7.6k次,点赞8次,收藏6次。解决:在vue.config.js 文件中 module.exports 上面添加const path = require('path')const webpack = require('webpack')function resolve(dir) { return path.join(__dirname, dir)}_resolve is not defined

ocm名单 oracle_oracle ocm证书编号-程序员宅基地

文章浏览阅读219次。{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平..._ocm证书编号

android apk解包和打包-程序员宅基地

文章浏览阅读2.1w次,点赞5次,收藏39次。最近项目开发,我的jar包和资源文件给别的同事打包,这样我自己测试很麻烦,每次改一点东西都要找人打包测试,很麻烦,就想着能够解包,更新一下自己的部分代码,再打包apk直接测试。后来找了一些网上内容,也没那么麻烦,成功搞定。主要分为下面几个大的步骤:一、下载apktools网上下载apktools工具,应该有很多工具来解包。二、用apktools解包apk可以直接修改后缀名为zip,..._apk解包

推荐文章

热门文章

相关标签