VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1421|回复: 3

[交流] 总结const使用思想(C/C++)

[复制链接]
74_avatar_middle
在线会员 发表于 2012-3-16 18:33:19 | 显示全部楼层 |阅读模式
本帖最后由 davidsguo008 于 2012-3-16 19:26 编辑


使用const提高函数的健壮性
1.        使用const修饰函数的参数
当使用const作为函数的参数时,const的作用起到“保护该参数被以外改动”,这里的参数,指的是实参被函数拷贝后进入到函数体中的参数,使用const后,他不被改变。
当参数做输出时__out,绝不允许使用const型,因为这和输出的初衷相违背。
当参数做输入时__in,使用const进行修改该参数:
        如果输入参数采用“指针传递”,那么加上const修饰可以起到防止该指针被以外的改动,起到保护作用。
Void StringCopy (char *strDestination,const char *strSource);
StrSource指针的指向的内容不会被改变。
        如果输入参数采用“值传递”,那么加上const修饰可以起到防止修改系统自动产生的临时拷贝参数,因为是拷贝的,所以不会改变原数据,所以没必要使用。
        如果输入参数采用“引用传递”的时候,使用引用的目的就是要改变该变量的值,那么无需使用const,除非是传递对象的引用void Func(A &a),这里如果不适用引用,也就是void Func(A a),因为系统会赋值一个对象,这样会给系统增加许多负担,使用引用传递虽然很合适,但对象容易在函数体操作中被改变,所以这里很适合使用Const进行修饰,也就是void Func(const A &a);(适用于非内部数据类型)
                总结:
                ---------------------------------------------------------------------------------------------------------------
                对于非内部数据的输入参数,应该将“值传递”的方式改为“const引用传递”,
                目的提高效率。如:void Func(A a)  void Func(const A &a);
                ---------------------------------------------------------------------------------------------------------------
                对于内部数据的输入参数,不要将“值传递”改为“const引用传递”。
                ---------------------------------------------------------------------------------------------------------------
2.        使用const修饰函数的返回值
        如果使用“指针传递”的返回值加const修饰,返回的内容不能被修改,如果需要赋值给其他指针,必须是同类型
const char * GetString(void);
char *str = GetString();         // 错误
const char *str = GetString();        // 正确
        如果使用“值传递”方式,如果返回值是内部数据类型,则没必要加const进行修饰,如果不是内部数据类型,则函数A GetA(void)修改为const A & GetA(void);
        函数返回值使用“引用传递”方式的比较少,只出现在赋值函数中,目的是实现链式表达。
Class A
{….
                A & operate = (const A &other);                // 赋值函数
}
A a,b,c;                // abc为A的对象

a = b = c;                // 正式的链式赋值
3.        使用const修饰函数的成员函数
Class Stack
{
        Public:
                Void push(int elem);
                Int pop(void);
                Int GetCount(void) const;                // const成员函数
Private:
                Int m_num;
                Int m_data[100];
}
Int Stack::GetCount(void) const
{
                ++m_num;                // 错误,企图修改非const数据成员
                Pop();                        // 错误,企图调用非const成员函数
                Return m_num;
}

评分

参与人数 1威望 +3 驿站币 +5 +3 +5 收起 理由
51_avatar_small Syc + 3 + 5 + 3 + 5 赞一个!

查看全部评分





上一篇:[菜鸟编程]自己编写了一个生命游戏,请高手指教不足之处。
下一篇:计算机程序设计艺术据说都看懂了比尔盖茨会来找你
51_avatar_middle
online_admins 发表于 2012-3-16 20:06:32 | 显示全部楼层
感谢楼主分享!
08_avatar_middle
在线会员 发表于 2012-3-16 20:35:49 | 显示全部楼层
学习了..总结还不错... 顺便说下最后的 类const成员函数... 是当类对象是const的时候,,,可以调用的函数...
当然类对象不是const的时候也可以调用...
但是类对象是const的时候,不能调用非const函数...
实现机制应该是这样的const对象返回的会是一个临时的拷贝数据吧...
02_avatar_middle
online_vip 发表于 2012-3-16 20:36:54 | 显示全部楼层
多谢分享!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-16 17:05

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表