const 用法一摘分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
const 用法一摘 const 引用是指向 const 对象的引用 const int ival=1024; const int refVal=ival; //ok,both reference and object are const int ref2=ival; //error! non const reference to a const obj ect 可以读取但不能修改 refVal,因此,任何对 refVal 的赋值都是不合法的。这个限制有其 意义:不能直接对 ival 同值,因此不能通过使用 refVal 来修改 ival。 同理,用 ival 初始化 ref2 也是不合法的:ref2 是普通的非 const 引用,因此可以用来修改 ref2 指向的对象的值。能过 ref2 对 ival 赋值会导致修改 const 对象的值。为阻止这样的修改,需要规定将普通的引用绑定到 const 对象是不合法的。 const 引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量: int i=42; // legal for const reference ONLY! const int r=42; const int r2=r+i; double dval=3.14; const int r3=dval; 编译器展开: int temp=dval; const int ri=temp; 非 const 引用只能绑定到与该引用同类型的对象。 const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。 在 C++中真正的临时对象是看不见的,它们不出现在你的源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在两种条件下产生:为了使函数成功调用而进行隐式类型转换和函数返回对象时。理解如何和为什么建立这些临时对象是很重要的,因为构造和释放它们的开销对于程序的性能来说有着不可忽视的影响。 首先考虑为使函数成功调用而建立临时对象这种情况。当传送给函数的对象类型与参数类型不匹配时会产生这种情况。 在字符计数的例子里,能够成功传递 char 数组到 countChar 中,但是在这里试图用 cha r 数组调用 upeercasify 函数,则不会成功:。考虑一下这个函数: void uppercasify(string str); char subtleBookPlug[] = Effective C++; uppercasify(subtleBookPlug); // 错误! 没有为使调用成功而建立临时对象,为什么呢? 假设建立一个临时对象,那么临时对象将被传递到upeercasify 中,其会修改这个临时对象,把它的字符改成大写。但是对 subtleBookPlug 函数调用的真正参数没有任何影响; 仅仅改变了临时从 subtleBookPlug 生成的 string 对象。无疑这不是程序员所希望的。程序员传递 subtleBookPlug 参数到 uppercasify 函数中,期望修改 subtleBookPl ug 的值。当程序员期望修改非临时对象时,对非常量引用(references-to-non-cons t)进行的隐式类型转换却修改临时对象。这就是为什么 C++语言禁止为非常量引用(ref erence-to-non-const)产生临时对象。这样非常量引用(reference-to-non-con st)参数就不会遇到这种问题。 把一个 const 对象的地址赋给一个普通的,非const 对象的指针也会导致编译时错误: const double pi=3.14; double *ptr=pi; //error:ptr is a plain pointer const double *cptr=pi; //ok:cptr is a pointer to const 不能使用 void*指针保存 const 对象的地址,而必须用 const void*类型的指针保存。const int universe=42; const void *cpv=universe; const void *cpv=universe; //ok; void *pv=universe; //error:universe is const 允许把非 const 对象的地址赋给指向 const 对象的指针: double dval=3.14; cptr=dval; typedef string *pstring; const pstring cstr; //cstr is a const pointer to string string *const cstr ; // equivalent

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档