<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |