【转】const的用法,特别是用在函数前面与后面的区别!
2015-06-24 13:44
316 查看
1.用const修饰函数的参数
2用const修饰函数的返回值如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数
constchar*GetString(void);
如下语句将出现编译错误:
char*str=GetString();
正确的用法是
constchar*str=GetString();
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。
例如不要把函数intGetInt(void)写成constintGetInt(void)。
同理不要把函数AGetA(void)写成constAGetA(void),其中A为用户自定义的数据类型。
如果返回值不是内部数据类型,将函数AGetA(void)改写为constA&GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
classA
{
A&operate=(constA&other);//赋值函数
};
Aa,b,c;//a,b,c为A的对象a=b=c;//正常的链式赋值
(a=b)=c;//不正常的链式赋值,但合法
如果将赋值函数的返回值加const修饰,那么该返回值的内容不允许被改动。上例中,语句a=b=c仍然正确,但是语句(a=b)=c则是非法的。3const成员函数任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
classStack
{
public:
voidPush(intelem);
intPop(void);
intGetCount(void)const;//const成员函数
private:
intm_num;
intm_data[100];
};
intStack::GetCount(void)const
{
++m_num;//编译错误,企图修改数据成员m_num
Pop();//编译错误,企图调用非const函数
returnm_num;
}
const成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。
关于Const函数的几点规则:a.const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b.const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c.const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e.然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
一个函数
AcGePoint3dstartPoint()const;
const放在后面跟前面有区别么
准确的说const是修饰this指向的对象的
譬如,我们定义了
classA{
public:
f(int);
};
这里f函数其实有两个参数,第一个是A*constthis,另一个才是int类型的参数
如果我们不想f函数改变参数的值,可以把函数原型改为f(constint),但如果我们不允许f改变this指向的对象呢?因为this是隐含参数,const没法直接修饰它,就加在函数的后面了,表示this的类型是constA*constthis。
const修饰*this是本质,至于说“表示该成员函数不会修改类的数据。否则会编译报错”之类的说法只是一个现象,根源就是因为*this是const类型的
相关文章推荐
- 带网上开户表单jQuery焦点图
- NPAPI插件与JS交互开发详细记录
- oracle sql日期比较
- MS WORD 表格自动调整列宽,自动变漂亮,根据内容自动调整
- [一起学Hive]之五-Hive的视图和分区
- [转载] HTTP请求的TCP瓶颈分析
- dhroid学习(二)dhroid的fragment的注入问题
- HTML.ActionLink 和 Url.Action 的区别
- iOS开发之打包上传到App Store——(二)开发/发布流程
- 使用Gradle构建Android项目
- 嵌入式系统学习开发指导
- CorePlot学习 使用技巧
- java 枚举类型
- [Win32SDK基本]Static Control(2)Image Static Control
- [一起学Hive]之四-Hive的安装配置
- Java线程面试题 Top 50 (转载)
- int与long long之间的转换
- [转]Linux中设置服务自启动的三种方式
- Makefile
- 织梦5.7下载远程图片和资源无效全套最新解决方案