当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>高质量C++/C编程指南-第11章-别的编程经验(1)</b>[VC/C++编程]

赞助商链接



  本文“<b>高质量C++/C编程指南-第11章-别的编程经验(1)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

11.1 利用const提高函数的结实性
看到const关键字,C++程序员首先想到的大概是const常量.这可不是杰出的条件反射.假如只知道用const定义常量,那么相当于把炸药仅用于制作鞭炮.const更大的魅力是它可以修饰函数的参数、返回值,乃至函数的定义体. const是constant的缩写,“恒定不变”的意思.被const修饰的东西都遭到强迫保护,可以预防不测的变更,能提高程序的结实性.所以很多C++程序计划书籍倡议:“Use const whenever you need”.

11.1.1 用const修饰函数的参数

假如参数作输出用,不管它是什么数据范例,也不管它采取“指针传送”还是“引用传送”,都不能加const修饰,不然该参数将失去输出功效.

const只能修饰输入参数:

u 假如输入参数采取“指针传送”,那么加const修饰可以避免不测地窜改该指针,起到保护作用.

比方StringCopy函数:

void StringCopy(char *strDestination, const char *strSource);

此中strSource是输入参数,strDestination是输出参数.给strSource加上const修饰后,假如函数体内的语句试图窜改strSource的内容,编译器将指出错误.

u 假如输入参数采取“值传送”,由于函数将自动产生暂时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰.

比方不要将函数void Func1(int x) 写成void Func1(const int x).同理不要将函数void Func2(A a) 写成void Func2(const A a).此中A为用户自定义的数据范例.

u 关于非内部数据范例的参数而言,象void Func(A a) 这样声明的函数注定效率对比底.因为函数体内将产生A范例的暂时对象用于复制参数a,而暂时对象的构造、复制、析构历程都将损耗时间.

为了提高效率,可以将函数声明改成void Func(A &a),因为“引用传送”仅借用一下参数的别名罢了,不需求产生暂时对象.但是函数void Func(A &a) 存在一个缺陷:“引用传送”有大概改变参数a,这是我们不盼望的.办理这个问题很简单,加const修饰便可,因此函数终究成为void Func(const A &a).

以此类推,能否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完好没有必要,因为内部数据范例的参数不存在构造、析构的历程,而复制也非常快,“值传送”和“引用传送”的效率几近相当.

问题是如此的缠绵,我只好将“const &”修饰输入参数的用法总结一下,如表11-1-1所示.

关于非内部数据范例的输入参数,应当将“值传送”的方法改成“const引用传送”,目的是提高效率.比方将void Func(A a) 改成void Func(const A &a).

关于内部数据范例的输入参数,不要将“值传送”的方法改成“const引用传送”.不然既达不到提高效率的目的,又降低了函数的可理解性.比方void Func(int x) 不该该改成void Func(const int &x).

表11-1-1 “const &”修饰输入参数的法则

11.1.2 用const修饰函数的返回值

u 假如赐与“指针传送”方法的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被改正,该返回值只能被赋给加const修饰的同范例指针.

比方函数

const char * GetString(void);

以下语句将呈现编译错误:

char *str = GetString();

精确的用法是

const char *str = GetString();

u 假如函数返回值采取“值传送方法”,由于函数会把返回值复制到外部暂时的存储单元中,加const修饰没有任何代价.

比方不要把函数int GetInt(void) 写成const int GetInt(void).

同理不要把函数A GetA(void) 写成const A GetA(void),此中A为用户自定义的数据范例.

假如返回值不是内部数据范例,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率.但此时千万千万要当心,一定要搞清楚函数毕竟是想返回一个对象的“拷贝”还是仅返回“别名”便可以了,不然程序会出错.见6.2节“返回值的法则”.

u 函数返回值采取“引用传送”的场所并不多,这种方法普通只呈目前类的赋值函数中,目的是为了实现链式表达.

比方

class A

{…

A & operate = (const A &other); // 赋值函数

};

A a, b, c; // a, b, c 为A的对象

a = b = c; // 正常的链式赋值

(a = b) = c; // 不正常的链式赋值,但合理

假如将赋值函数的返回值加const修饰,那么该返回值的内容不答应被窜改.上例中,语句 a = b = c仍旧精确,但是语句 (a = b) = c 则是不法的.


  以上是“<b>高质量C++/C编程指南-第11章-别的编程经验(1)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .