浏览 3916 次
锁定老帖子 主题:温故而知新-const应用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-12
一种是in-class initialization 方式,这种方式只适用于: (三者同时满足)
如果要取此成员的地址,需要在类定义外加上这个变量的定义式: const int maxSize; (sizeof不包括在内,也就是即使计算这个成员的sizeof也一样能不需要写定义式) 目前的Gun编译器支持这种方式的定义 一种是非in-class initialization方式: 它适用于其他的类内的static const类型的定义. 定义方式: 在类定义内声明: static const string title; 然后在类外定义: const string title = "using const"; enum hack可以解决const 无法解决的一些问题,比如在类中声明数组,而数组的长度需要用const常量来表示,而编译器正好不支持in-class initialization定义方式,这时需要使用enum hack。enum{maxSize = 10}。 初始化的值必须是integer类型(不包括float, double),而且使用sizeof(maxSize)测试名字长度,有结果,而且总是4(eclipse3.3中验证通过) 对于const或者非const对象都可以调用const 成员函数,而非const成员函数则只能对非const对象调用。 问: 如何定义const 类型的类内成员变量?(注意:非static的,虽然这种要求很荒谬) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-03-15
非const对象也可以调用const 成员函数,但是我们有时候仍然需要为此类型定义对应的非const的成员函数。这时候,我们是要在const成员函数中调用非const成员函数呢,还是在非const成员函数中调用const的成员函数呢?
虽然我们将某些函数定义为const,但是我们仍然希望在这个函数中能改变某些私有变量(这些私有变量不会影响对象的const性,可能这个变量只是作为访问记录,而不作为实际的属性),这时候我们就需要mutable关键字。比如:mutable int cursor,将成员属性声明为mutable。 |
|
返回顶楼 | |
发表时间:2008-03-16
xombat 写道 非const对象也可以调用const 成员函数,但是我们有时候仍然需要为此类型定义对应的非const的成员函数。这时候,我们是要在const成员函数中调用非const成员函数呢,还是在非const成员函数中调用const的成员函数呢?
使用non-const函数调用const函数,因为non-const函数不保证对数据进行修改,如果两个函数不一样的地方就在:non-const函数在完成const函数的基础上又修改了其他数据,使用non-const函数调用const函数就可以轻松做到这些(只需两次转型),而相反的调用却做不到这些,而且有数据被修改的危险。 |
|
返回顶楼 | |
发表时间:2008-03-16
问:如果构造函数或者析构函数为const,则会出现什么后果?
答:导致编译时错误:constructor/destructor may not be cv-qualified;(请问这里的cv代表什么?) const用在修饰成员函数时,我们要尽可能保证他是logical constness。但是默认的情况下,编译器会保证const成员函数是bitwise constness。两者严格程度没有上下之分,bitwise constness全靠编译器来维持,而logical constness则让人感觉更合理,因为他靠一个程序员通过对现实的理解来维持。编译器正在朝着更严格的bitwise constness发展,但是仍然无法保证const成员函数中修改不了此对象的成员属性,effective C++(条款3)中就列举出了一个hack方法,通过返回指针所指向的数据的引用,而这个指针又正好指向其中某个成员数据。 logical constness有时候认为在成员函数中修改某些值不会影响对象的const性(基于对现实的理解),因此这里需要一个摆动场:mutable关键字。 问:const 成员函数不能(直接)修改non-static成员的值,但是可以很顺利的修改static成员的值,为什么这样设计? |
|
返回顶楼 | |