现在的位置: 首页 > 综合 > 正文

Effective C++之三

2013年10月09日 ⁄ 综合 ⁄ 共 1336字 ⁄ 字号 评论关闭

     主题:尽可能使用const。

     const运用范围很广:全局常量、类内常量、静态常量、输入参数常量、返回值常量、函数常量。声明为常量后,编译器会检查其常量性。对指针,const可用于说明指针本身、指针指向内容、两者都是常量。对指针指向内容的cosnt,C++语法支持两种语法(参见Widget例子);我个人习惯于写在左边,但是考虑到写template时的一致性,《C++ Template》中建议统一写在右边。

     STL中iterator有类似指针的语义,如果通过迭代器访问不变的元素,可以使用const_iterator。

     函数的参数、返回值和本身都可以声明为cosnt,一一说明如下:

     - call by cosnt reference是提高效率的重要方法。对类,采用call by value的方式,有在堆栈上构建临时对象的开销,故call by reference是更有效的方法。如果参数是不变的,那const能使接口更明确:函数调用不改变参数的状态;

     - 返回参数常量,Mayers举了个有理数的例子,如果返回值不是常量,语法上允许类的使用者写(a+b)=c;这样的语句。这有悖于常理,所谓常理就是内建类型例如int的语法。这也是设计Object-based类的原则之一,如果你不知道一种设计是否合理,那就参考int的语法,尽量保持与内建类型的语法的一致性

    - 函数本身是const的。这和常量参数有关,越多的常量函数,类作为call by const reference的机会越大。

    对于常量函数,Mayers还有话要说,那就是bitwise-constness和logical-constness。C++语言支持bitwise-constness,如果你声明常量函数后,语言保证不会修改成员变量的状态[1],或者说不会改变该对象的内存映像。在讨论logical-constness前,看两个例子:

    1) 有一个指向字符串的指针的成员变量,函数不改变该指针,但是将字符串的内容修改掉。这个函数是bitwise-constness的;

    2) 有一个单纯的Get函数获取某一成员变量内容,在多线程环境下需要调用锁操作,假设锁不是bitwise-const的。这样,Get函数也不是bitwise-cosnt的。

    站在logical-constness的观点,也就是业务逻辑的观点,情况1逻辑上不是const的,而情况2倒是const的。一个设计准则:接口的const性应该指其logical-constness。对情况1,不将函数声明为const就完了,对于情况2则需要语言的支持,那就是mutable关键字。

    Mayers还谈到了一个大家不太注意的语言特性,那就是const函数可以重载(overload),参见TextBlock的例子。当然,cosnt和非const函数的定义的唯一区别就是返回值的类型,英雄所见略同,重复代码列为重构坏味道之首,文章又探讨了消除该重复的方式(略)。

    [1]处叙述得不严密,const函数可以修改mutable成员变量,const_cast或C-style cast后成员变量状态都是可以改变的。 

抱歉!评论已关闭.