const的用法小结(转)
来源:互联网 发布:php虚拟主机销售系统 编辑:程序博客网 时间:2024/05/20 03:04
const的用法小结
1.const用于修饰函数参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。const只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy函数:
voidStringCopy(char*strDestination, const char *strSource);
其中strSource是输入参数,strDestination是输出参数。给strSource加上const修饰后,如果函数体内的语句试图改动strSource的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰。
例如不要将函数voidFunc1(int x) 写成voidFunc1(const int x)。同理不要将函数voidFunc2(A a)写成voidFunc2(const A a)。其中A为用户自定义的数据类型。
对于非内部数据类型的参数而言,象voidFunc(Aa) 这样声明的函数注定效率比较底。因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为voidFunc(A&a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数voidFunc(A&a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为voidFunc(const A &a)。
小结:对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将voidFunc(A a) 改为voidFunc(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(int x) 不应该改为voidFunc(const int &x)。
2.const用于修饰函数返回值
如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数
constchar * GetString(void);
如下语句将出现编译错误:
char*str = GetString();
正确的用法是
constchar *str =GetString();
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。
例如不要把函数intGetInt(void) 写成constint GetInt(void)。
同理不要把函数AGetA(void) 写成constA GetA(void),其中A为用户自定义的数据类型。
3.const成员函数
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
classStack
{
public:
void Push(int elem);
int Pop(void);
intGetCount(void) const; // const成员函数
private:
intm_num;
int m_data[100];
};
intStack::GetCount(void)const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop();// 编译错误,企图调用非const函数
returnm_num;
}
- const的用法小结(转)
- Const用法小结 (转)
- const用法小结(转)
- const的用法小结
- CONST的用法小结:
- Const用法小结 (选择自 yuguanglou 的 Blog)
- C++关键字Const的用法小结
- C++ 关键字 const 的用法小结
- 关于const用法的一些小结
- Const用法总结:Const,Const函数,Const变量,函数后面的Const (转)
- C++中 Const用法小结(转载)
- [转载]Const用法小结
- Const用法小结
- Const用法小结
- Const用法小结[转载]
- Const用法小结
- Const用法小结
- Const用法小结
- 764A
- MVC模式 (基本理解)
- 从基础开始的异世界生活-----poj1753
- 深入理解Spring事务原理
- android请求连接wifi之后验证密码是否正确的方法
- const的用法小结(转)
- JavaSE 学习参考:循环语句中的break
- Eclipse的使用
- Java命名规范
- FAAC源码阅读(2)——AAC的编解码流程
- Direct3D---三维世界中摄像机的构建
- 【JavaScript】使用Chrome进行调试(如何使用Chrome开发者工具)
- mybatis--整合spring
- C# 索引器和运算符的重载