`
xombat
  • 浏览: 163680 次
  • 性别: Icon_minigender_1
  • 来自: 乌托邦
社区版块
存档分类
最新评论

温故而知新-const应用

阅读更多
class专属常量的声明和定义有两种方式:
一种是in-class initialization 方式,这种方式只适用于: (三者同时满足)
       
  • 1.新式编译器
  •         2.integral type(ints, chars, bools)(floats, doubles有些例外,它支持这种方式,但要求类外部一定要有定义式)
  •         3.static const
这种定义方式只需要在类定义段中提供声明即可。 static const int maxSize = 10;
    如果要取此成员的地址,需要在类定义外加上这个变量的定义式: 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的,虽然这种要求很荒谬)
分享到:
评论
3 楼 xombat 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成员的值,为什么这样设计?
2 楼 xombat 2008-03-16  
xombat 写道
非const对象也可以调用const 成员函数,但是我们有时候仍然需要为此类型定义对应的非const的成员函数。这时候,我们是要在const成员函数中调用非const成员函数呢,还是在非const成员函数中调用const的成员函数呢?


使用non-const函数调用const函数,因为non-const函数不保证对数据进行修改,如果两个函数不一样的地方就在:non-const函数在完成const函数的基础上又修改了其他数据,使用non-const函数调用const函数就可以轻松做到这些(只需两次转型),而相反的调用却做不到这些,而且有数据被修改的危险。
1 楼 xombat 2008-03-15  
非const对象也可以调用const 成员函数,但是我们有时候仍然需要为此类型定义对应的非const的成员函数。这时候,我们是要在const成员函数中调用非const成员函数呢,还是在非const成员函数中调用const的成员函数呢?

虽然我们将某些函数定义为const,但是我们仍然希望在这个函数中能改变某些私有变量(这些私有变量不会影响对象的const性,可能这个变量只是作为访问记录,而不作为实际的属性),这时候我们就需要mutable关键字。比如:mutable int cursor,将成员属性声明为mutable。

相关推荐

Global site tag (gtag.js) - Google Analytics