智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

const在函數(shù)聲明中的應(yīng)用

來源:網(wǎng)絡(luò)

點(diǎn)擊:1527

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: const,函數(shù)聲明

      1.在一個(gè)函數(shù)聲明中,const 可以修飾函數(shù)的返回值,或某個(gè)參數(shù);對于成員函數(shù),還可以修飾是整個(gè)函數(shù)。有如下幾種情況,以下會逐漸的說明用法:

      A& perator=(const A& a);

      void fun0(const A* a );

      void fun1( ) const; // fun1( ) 為類成員函數(shù)

      const A fun2( );

      1) 修飾參數(shù)的const,如 void fun0(const A* a ); void fun1(const A& a);

      調(diào)用函數(shù)的時(shí)候,用相應(yīng)的變量初始化const常量,則在函數(shù)體中,按照const所修飾的部分進(jìn)行常量化,如形參為const A* a,則不能對傳遞進(jìn)來的指針的內(nèi)容進(jìn)行改變,保護(hù)了原指針?biāo)赶虻膬?nèi)容;如形參為const A& a,則不能對傳遞進(jìn)來的引用對象進(jìn)行改變,保護(hù)了原對象的屬性。

      [注意]:

      參數(shù)const通常用于參數(shù)為指針或引用的情況,且只能修飾輸入?yún)?shù);若輸入?yún)?shù)采用“值傳遞”方式,由于函數(shù)將自動產(chǎn)生臨時(shí)變量用于復(fù)制該參數(shù),該參數(shù)本就不需要保護(hù),所以不用const修飾。

      [總結(jié)]:

      對于非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),因該將“值傳遞”的方式改為“const引用傳遞”,目的是為了提高效率。例如,將void Func(A a)改為void Func(const A &a)

      對于內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const引用傳遞”。否則既達(dá)不到提高效率的目的,又降低了函數(shù)的可理解性。例如void Func(int x)不應(yīng)該改為void Func(const int &x)

      2) 修飾返回值的const,如const A fun2( ); const A* fun3( );

      這樣聲明了返回值后,const按照“修飾原則”進(jìn)行修飾,起到相應(yīng)的保護(hù)作用。const Rational operator*(const Rational& lhs, const Rational& rhs)

      {

      return Rational(lhs.numerator() * rhs.numerator(),

      lhs.denominator() * rhs.denominator());

      }

      返回值用const修飾可以防止允許這樣的操作發(fā)生:Rational a,b;

      Radional c;

      (a*b) = c;

      一般用const修飾返回值為對象本身(非引用和指針)的情況多用于二目操作符重載函數(shù)并產(chǎn)生新對象的時(shí)候。

      [總結(jié)]:

      (1)一般情況下,函數(shù)的返回值為某個(gè)對象時(shí),如果將其聲明為const時(shí),多用于操作符的重載。通常,不建議用const修飾函數(shù)的返回值類型為某個(gè)對象或?qū)δ硞€(gè)對象引用的情況。原因如下:如果返回值為某個(gè)對象為const(const A test = A 實(shí)例)或某個(gè)對象的引用為const(const A& test = A實(shí)例) ,則返回值具有const屬性,則返回實(shí)例只能訪問類A中的公有(保護(hù))數(shù)據(jù)成員和const成員函數(shù),并且不允許對其進(jìn)行賦值操作,這在一般情況下很少用到。

      (2)如果給采用“指針傳遞”方式的函數(shù)返回值加const修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。如:

      const char * GetString(void);

      如下語句將出現(xiàn)編譯錯(cuò)誤:

      char *str=GetString();

      正確的用法是:

      const char *str=GetString();

      (3)函數(shù)返回值采用“引用傳遞”的場合不多,這種方式一般只出現(xiàn)在類的賻值函數(shù)中,目的是為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)。如:

      class A

      {…

      A &operate = (const A &other); //賦值函數(shù)

      }

      A a,b,c; //a,b,c為A的對象

      …

      a=b=c; //正常

      (a=b)=c; //不正常,但是合法

      若賦值函數(shù)的返回值加const修飾,那么該返回值的內(nèi)容不允許修改,上例中a=b=c依然正確。(a=b)=c就不正確了。

      [思考3]: 這樣定義賦值操作符重載函數(shù)可以嗎?

      const A& perator=(const A& a);

      2. 類成員函數(shù)中const的使用

      一般放在函數(shù)體后,形如:void fun() const;

      任何不會修改數(shù)據(jù)成員的函數(shù)都因該聲明為const類型。如果在編寫const成員函數(shù)時(shí),不慎修改了數(shù)據(jù)成員,或者調(diào)用了其他非const成員函數(shù),編譯器將報(bào)錯(cuò),這大大提高了程序的健壯性。如:

      class Stack

      {

      public:

      void Push(int elem);

      int Pop(void);

      int GetCount(void) const; //const 成員函數(shù)

      private:

      int m_num;

      int m_data[100];

      };

      int Stack::GetCount(void) const

      {

      ++m_num; //編譯錯(cuò)誤,企圖修改數(shù)據(jù)成員m_num

      Pop(); //編譯錯(cuò)誤,企圖調(diào)用非const函數(shù)

      Return m_num;

      }

      3. 使用const的一些建議

      (1)要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;

      (2)要避免最一般的賦值操作錯(cuò)誤,如將const變量賦值,具體可見思*;

      (3)在參數(shù)中使用const應(yīng)該使用引用或指針,而不是一般的對象實(shí)例,原因同上;

      (4) const在成員函數(shù)中的三種用法(參數(shù)、返回值、函數(shù))要很好的使用;

      (5) 不要輕易的將函數(shù)的返回值類型定為const;

      (6)除了重載操作符外一般不要將返回值類型定為對某個(gè)對象的const引用;

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請聯(lián)系我們刪除。

    主站蜘蛛池模板: 配重铁砂|合金钢丸|山东铁砂|济南嘉日金属制品有限公司 | 影像测量仪|检测设备定制|平面度测量仪|三坐标测量机|广州市海科思自动化设备有限公司-400-0528-668 | 芜湖液压配件-液压过滤器滤芯-水过滤器-芜湖新俊液压设备有限公司 | 瑞安网站建设_网站制作_做网站找瑞安联创网络:专业网页制作、手机网站、SEO百度网站关键字优化 软文营销推广-新闻稿发布-软文撰写-百科词条编辑-品牌全案策划推广网络营销传播-喜尚传媒 | 耐火砖厂家价格-郑州荣盛窑炉耐火材料有限公司 | 青岛相控阵检测_无损探伤检测机构_相控阵超声检测公司-青岛发现检验技术咨询 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 河北安润防腐管业股份有限公司-远程供液管路_远距离供液管路_远程供液系统 | 盘扣租赁|盘扣架租赁|盘扣脚手架|盘扣脚手架租赁|盘扣式脚手架|盘扣式脚手架租赁-北京亚欧盟盘扣租赁有限公司 | 济南塑料袋,食品包装袋,复合塑料袋,方便袋-济南精美塑料包装厂 | 诸城市佳品食品机械有限公司| 伸缩接头,限位伸缩接头,传力接头,可拆卸接头,橡胶接头,衬四氟橡胶接头,橡胶软连接,橡胶补偿器,防水套管- 巩义市隆盛管道设备有限公司 | 腾云网-智慧网络营销服务提供商| 助乐邦轮椅,北京轮椅置换,电动轮椅置换,轮椅回收北京,轮椅送货上门服务 | 汽车配件加工生产模具-手板样品模型厂家-拓维模型 | 清扫器-聚氨酯清扫器-合金清扫器-四连杆自动纠偏-机械纠偏-锥辊纠偏-衡水涌泉机械科技有限公司 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 西安西雷脉冲功率技术有限公司-高压调制器/加速器与脉冲功率系统的研发/生产/应用推广/高压脉冲电源的应用研究/设计/生产和销售/高功率脉冲器件/材料与仪器设备的研发/生产和销售/高电压/大电流/强磁场环境的模拟及测试服务/会议会展服务/货物及进出口的业务/脉冲功率技术领域类的技术转让 | 太阳能路灯-高杆灯-景观灯-玉兰灯-中华灯-LED市电-庭院灯厂家-扬州汉威光电科技有限公司 | 长沙变频器维修,变频器维修,ABB变频器维修,西门子变频器维修,施耐德变频器维修,伺服驱动器维修,工业机器人维修,20年专业工控电气维修,长沙文铖电气设备有限公司_长沙文铖电气设备有限公司 | 硫酸、硫酸铵、氯磺酸、氯化亚砜、硫酸钾、对位酯生产销售 - 河北和合化工有限公司 | 徐州护栏,铝艺栏杆,铝艺大门,铝艺栏杆门,别墅铝艺大门-徐州桂丰金属科技有限公司 | 仪器校准-计量检测-计量校准-中健计量检测(广东)有限公司 | 液压万能试验机价格_电子万能试验机|摩擦磨损试验机厂家-济南辰达试验机制造有限公司 | 智慧园区平台_智慧园区智慧写字楼运营平台领导品牌 | 希希助培是专业的教育信息化全场景服务商,为教育培训机构提供教务管理、招生营销、财务管理、家校互动等 | 深圳市桃子自动化科技有限公司-点胶机_灌胶机_焊锡机_螺丝机_SCARA机器人 | 硬度计-布氏硬度计-维氏硬度计-莱洛特试验仪器有限公司 | 戒网瘾学校-陕西正规戒网瘾-叛逆青少年教育学校-重生教育官网 | 乌海市腐植酸盐加工,内蒙古腐植酸钠,内蒙古型煤粘合剂生产厂家|创联腐植酸盐加工有限公司 | 液体灌装机_全自动灌装机_大桶灌装机_200L灌装机_涂料油漆灌装机-昆山灌装自动化设备有限公司 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 威海电子电镀,山东五金电镀,威海镀镍,山东镀铜镍铬-威海鑫镱金属制品厂 | 西安泰富西玛电机_西玛电机_西安西玛电机| 天下机械|机床商讯-机械网|机械技术|机械信息|机床资讯|机床设备|机床商讯杂志 | 仪器校准,校验,校正,检定选值得托付的第三方法定计量检测机构! 铱金供应-上海钌合金-氯铱酸厂家-上海庞势新材料科技有限公司 | 上海拓展训练_上海拓展培训_上海团建活动_上海团建策划 | 膜结构车棚厂家-张拉膜景观棚-汽车充电桩停车棚-嘉兴铭邦膜结构公司 | 南通众诚数控机床有限公司-液压机,剪板机,折弯机,卷板机,液压冲床,路灯杆设备专业制造商 | 乐贝贝童装批发网-外贸童装批发厂家直销|网上品牌童装批发市场|儿童服装批发首选 | 移动CRM软件_SaaS CRM_crm管理软件系统_crm客户关系管理系统_销售管理软件-上海企能软件科技有限公司 |