当前位置: 首页 > 编程日记 > 正文

const在函数前与函数后的区别 [转]

[转] http://blog.csdn.net/clozxy/article/details/5679887

一   const基础   
    
  如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:   
    
  int   b   =   500;   
  const   int*   a   =   &b;              [1]   
  int   const   *a   =   &b;              [2]   
  int*   const   a   =   &b;              [3]   
  const   int*   const   a   =   &b;   [4]   
    
  如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective   c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a   =   3   ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。   
  另外const   的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const   可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:a&   operator=(const   a&   a);   
  void   fun0(const   a*   a   );   
  void   fun1(   )   const;   //   fun1(   )   为类成员函数   
  const   a   fun2(   );   
    
  二   const的初始化   
    
  先看一下const变量初始化的情况   
  1)   非指针const常量初始化的情况:a   b;   
  const   a   a   =   b;   
    
  2)   指针(引用)const常量初始化的情况:a*   d   =   new   a();   
    const   a*   c   =   d;   
  或者:const   a*   c   =   new   a();   
  引用:   
    a   f;   
    const   a&   e   =   f;   //   这样作e只能访问声明为const的函数,而不能访问一般的成员函数;   
    
  [思考1]:   以下的这种赋值方法正确吗?   
  const   a*   c=new   a();   
  a*   e   =   c;   
  [思考2]:   以下的这种赋值方法正确吗?   
  a*   const   c   =   new   a();   
  a*   b   =   c;   
    
  三   作为参数和返回值的const修饰符   
    
  其实,不论是参数还是返回值,道理都是一样的,参数传入时候和函数返回的时候,初始化const变量   
  1   修饰参数的const,如   void   fun0(const   a*   a   );   void   fun1(const   a&   a);   
  调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const   a*   a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const   a&   a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。   
  [注意]:参数const通常用于参数为指针或引用的情况;   
  2   修饰返回值的const,如const   a   fun2(   );   const   a*   fun3(   );   
  这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。const   rational   operator*(const   rational&   lhs,   const   rational&   rhs)   
  {   
  return   rational(lhs.numerator()   *   rhs.numerator(),   
  lhs.denominator()   *   rhs.denominator());   
  }   
    
  返回值用const修饰可以防止允许这样的操作发生:rational   a,b;   
  radional   c;   
  (a*b)   =   c;   
    
  一般用const修饰返回值为对象本身的情况多用于二目操作符重载函数并产生新对象的时候。

  [总结]   一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对 某个对象引用的情况。   
  原因如下:   
  如果返回值为某个对象为const或某个对象的引用为const   ,则返回值具有const属性,则返回实例只能访问类a中的公有数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用 到。   
    
  [思考3]:   这样定义赋值操作符重载函数可以吗?   
  const   a&   operator=(const   a&   a);   
    
  四   类成员函数中const的使用   
    
  一般放在函数体后,形如:void   fun()   const;   
  如果一个成员函数的不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大 大提高了程序的健壮性。

  五   使用const的一些建议   
    
  1   要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;   
  2   要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;   
  3   在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;   
  4   const在成员函数中的三种用法要很好的使用;   
  5   不要轻易的将函数的返回值类型定为const;   
  6   除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

相关文章:

《HTML5游戏编程核心技术与实战》——2.8 小结

本节书摘来自异步社区《HTML5游戏编程核心技术与实战》一书中的第2章,第2.8节,作者: 向峰 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.8 小结 本章介绍了canvas的一些常用的操作,作为HTML5的最重要的特性,canvas使得…

IANA保留地址

IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。国际互联网代理成员管理局(IANA)是在国际互联网中使用的IP 地址、域名和许多其它参数的管理机构。IP地址、自…

张亚勤世界互联网大会谈AI:将变革传统行业,催生新业态

11月23日至24日,一年一度的世界互联网大会互联网发展论坛如期召开。全球疫情冲击下,科技创新成为了海内外共同关注的焦点。其中,人工智能作为新一轮科技革命和产业变革的重要驱动力量,同样饱受关注。 在24日上午的"人工智能…

如何通过参数来切换图表和数据

在报表设计的过程中有时候我们想在一张报表中既可以看到数据又可以看到图表,但是如果把数据和图表放在同一页面中似乎不太美观,所以我们可以用参数来控制是要显示数据还是显示图表。下面来看看如何实现通过参数来切换图表和数据 设计一张既有数据又有图表…

安装 Fedora 22 后要做的事情

Red Hat操作系统的社区开发版的最新成员Fedora 22,已经于2015年5月26日发布了。对这个经典的Fedora发行版的发布充斥着各种猜测和预期,而最终Fedora 22推出了许多重大变化。 就初始化进程而言,Systemd还是个新生儿,但它已经准备好…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部552-556条

552. 无人驾驶与自动驾驶 无人驾驶与自动驾驶技术属于人工智能技术范畴,近年来有长足进步。无人驾驶与自动驾驶的实现的与路况密切有关。 根据国际自动机工程师学会2004年制度的“无人驾驶与自动驾驶技术界定标准”,将路况分成5级: 根据美国…

Web的桌面提醒(Popup)

大多数Windows程序都有桌面提醒(Popup)功能,如Msn Messenger,Outlook2003,FoxMail,SharpReader等,对用户来说可以非常的方便最新的信息。 在Web中借用IE5.5的Popup,也可以实现类似的…

linux的裁剪过程,让你的小linux更加完善,赶快试试吧!

一、系统启动流程: 1、POST-->BIOS(Boot Sequence)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab) 第一步首先加电自检,计算机本身不会执行程序,由此它会…

《Adobe Premiere Pro CC经典教程(彩色版)》——2.2 建立项目

本节书摘来自异步社区《Adobe Premiere Pro CC经典教程(彩色版)》一书中的第2课,第2.2节,作者 【英国】Maxim Jago(马克西姆 亚戈),译者 陈昕昕,郭光伟 ,更多章节内容可以…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部557-561条如下

557,解决最后一公里短板,提升语义网络内涵,使之具有实现可解释人工智能(或实现认知智能)的能力,尚待努力! 在跟贴263、521中,谈到提升语义网络内涵的解决之道,要坚持数据…

struts2+hibernate+Spring分层开发

web.xml中要加Spring的listener,struts2的filter的配置。UI struts2: jsp struts.xml ActionSpring ActionSpring:applicationContent-actions.xml Service Spring:applicationContent-services.xml DAO Entity DAL hibernate: …

DataGrid鼠标事件处理

http://blog.csdn.net/bgu/完成功能是DataGrid的页面选中事件、鼠标事件、双击事件改变TR的色彩。代码很简单,只是一点JS操作。JS文件:GridControl.js/*------------ DataGrid鼠标事件处理 ------------功能:用于数据梆定后鼠标事件参数说明:obj:对像thisfontColor:…

《精通 ASP.NET MVC 3 框架(第三版)》----第2章 准备工作 2.1 准备工作站

本节书摘来自异步社区《精通 ASP.NET MVC 3 框架(第三版)》一书中的第2章,第1节,作者: 【美】Adam Freeman , Steven Standerson,译者: 林逸 , 李萍 , 更多章节内容可以访问云栖社区…

DataGrid鼠标事件方法

http://blog.csdn.net/bgu/ JS文件源码:GridColorControl.js/*-----------------调用说明-----------------说明:可用于架设页面事件。入口函数:OnFocusSet(....)如:OnFocusSet( "#000000","#FFFFFF","#…

张亚勤谈数字化3.0:由物理与生物世界的数字化构成 | WIC

11月23日至24日,一年一度的世界互联网大会互联网发展论坛如期召开。全球疫情冲击下,科技创新成为了海内外共同关注的焦点。其中,人工智能作为新一轮科技革命和产业变革的重要驱动力量,同样饱受关注。在24日上午的“人工智能&#…

print_r() 'ThinkPHP\Common\common.php 601

Fatal error: print_r() [<a hrefref.outcontrol>ref.outcontrol</a>]: Cannot use output buffering in output buffering display handlers in D:\www\bjydf\ThinkPHP\Common\common.php on line 601 在thinkphp中用phpexcel导出数据错误<b>Fatal error<…

《Android传感器开发与智能设备案例实战》——导读

本节书摘来自异步社区《Android传感器开发与智能设备案例实战》一书中的目录&#xff0c;作者 朱元波&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录前 言 第1章 Android开发技术基础 第1章第1.1节智能手机操作系统介绍第1章第1.2节Android的巨大优势[…

详解基于busybox、dropbear、ngnix制作完整的嵌入式Linux系统

说明&#xff1a; 《一》&#xff1a;查看此博文&#xff0c;建议查看笔者上一篇博文(Linux启动过程)&#xff0c;因为只有在完全了解Linux系统启动流程及一些配置文件的相关性&#xff0c;在阅读此博文才能有思路&#xff0c;理解起来更容易写。 《二》&#xff1a;此…

CSDN湘苗培优,打造高素质技术人才

前言2020年长沙发出软件再出发号召&#xff0c;同时发布了《长沙市软件和信息技术服务业发展三年(2020-2022 年)行动计划》。当软件产业的生态逐渐建立&#xff0c;企业孵化培育的土壤逐渐肥沃&#xff0c;长沙软件产业焕发出前所未有的活力和生机&#xff0c;一大批软件产业项…

在ASP.NET 中实现单点登录

出自&#xff1a;【孟宪会之精彩世界】 发布日期&#xff1a;2005年1月27日 8点48分0秒 [有删改] 由于某些原因&#xff0c;在我们的应用中会遇到一个用户只能在一个地方登录的情况&#xff0c;也就是我们通常所说的单点登录。在ASP.NET中实现单点登录其实很简单&#xff0c;下…

《Unity着色器和屏幕特效》——2.2 进阶的透明效果

本节书摘来自华章计算机《Unity着色器和屏幕特效》一书中的第2章&#xff0c;第2.2节&#xff0c;作者&#xff3b;美&#xff3d;杰米迪恩&#xff08;Jamie Dean&#xff09;&#xff0c;译 周翀&#xff0c;张薇&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众…

机器模拟共情,情感AI正踏足诸多行业

作者 | 平凡来源 | CSDN作者简介&#xff1a;平凡&#xff0c;诺桑比亚大学计算机科学博士情感AI是一个跨学科领域&#xff0c;涉及计算机科学、 心理学和认知科学&#xff0c;旨在研发能够识别、解释、处理、模拟人类情感的系统。[虽然该学科最早可追溯至早期的哲学研究&#…

SQL Server 中各个系统表的作用

sysaltfiles 主数据库 保存数据库的文件syscharsets 主数据库 字符集与排序顺序sysconfigures 主数据库 配置选项syscurconfigs 主数据库 当前配置选项sysdatabases 主数据库 服务器中的数据…

“批判”按劳取酬

“批判”按劳取酬<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Jack zhai按劳取酬的意思就是付出多少劳动&#xff0c;就获得多少报酬&#xff1b;这曾经是我认为最为合理的老板与员工之间的合约关系。然而近几年&#xff0c;…

《编译与反编译技术实战 》一2.3 编译器的设计与实现概述

本节书摘来自华章出版社《编译与反编译技术实战 》一书中的第2章&#xff0c;第2.3节&#xff0c;庞建民 主编 &#xff0c;刘晓楠 陶红伟 岳 峰 戴超 编著&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 编译器的设计与实现概述 根据不同的用…

U^2-Net跨界肖像画,完美复刻人物细节,GitHub标星2.5K+

来源 | Jack Cui头图 | CSDN下载自视觉中国今年提出的 U^2-Net 显著性检测算法&#xff0c;刷爆了 reddit 和 twitter&#xff0c;号称是 2020 年「地表最强」的静态背景分割算法&#xff0c;可以看下效果&#xff1a;你以为今天要讲分割&#xff1f;错&#xff01;U^2-Net 这两…

使用sourceInsight 提高代码编写效率

source Insight是一个强大的程序编写器和代码浏览器&#xff0c;它拥有内置的对C/C,C#和Java等程序的分析。本文总结了常用的快捷键&#xff0c;重要的宏的应用&#xff08;可以多行注释&#xff0c;自动补全&#xff0c;自动生成头文件和函数说明&#xff0c;修改说明……&…

php几个预定义变量$_SERVER['DOCUMENT_ROOT']

<?php echo documentroot:.$_SERVER[DOCUMENT_ROOT].<br>; //根目录,在apache的配置文件里定义&#xff1a;httpd.conf 比如&#xff1a;DocumentRoot "D:/work/php_root" echo httphost:.$_SERVER[HTTP_HOST].<br>; //域名&#xff0c;比如&#…

《用于物联网的Arduino项目开发:实用案例解析》—— 3.4 小结

本节书摘来自华章出版社《用于物联网的Arduino项目开发&#xff1a;实用案例解析》一 书中的第3章&#xff0c;第3.4节&#xff0c;作者&#xff3b;美&#xff3d;安德尔杰韦德&#xff08;Adeel Javed&#xff09;&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众…

HttpClient学习

HttpClient学习 &#xff08;1&#xff09;下面列举几个主要的Http相关概念的类 类名描述HttpClient建立请求客户端HttpGet代表请求方法&#xff0c;类似的还有HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, HttpOptions等HttpResponse表示请求的响应&#xff08;包括…