• [Effective C++, 学习总结] 03 尽可能使用const


    关键字const,你可以用它在classes外部修饰globalnamespace作用域中的常量,或修饰文件、函数、或区块作用域(block scope)中被声明

    static的对象。

    也可以用它修饰classes内部的staticnon-static成员变量。

    1 char greeting[] = "Hello";
    2 char *p = greeting;                // non-const pointer, non-const data
    3 const char *p = greeting;          // non-const pointer, const data
    4 char * const p = greeting;         // const pointer, non const data
    5 const char * const p = greeting;   // const pointer, const data.

    如果const出现在星号左边,表示被指物是常量;

    如果出现在星号右边,表示指针自身是常量;

    如果出现在星号两边,表示被指物和指针两者都是常量。

    1 void f1(const Widget *pw);
    2 void f2(Widget const *pw);
    3 // 以上两者都是一样的。

    令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而不至于放弃安全性和高效性。

    如下所例。

    1 class Rational { ... };
    2 
    3 const Rational operator * (const Rational &lhs, const Rational &rhs);
    4 
    5 Rational a, b, c;
    6 ...
    7 (a * b) = c;  // 在a * b的成果上调用operator=

    const成员函数

    第一,它们使用class接口比较容易理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行,很重要。

    第二,使“操作const对象”成为可能。

    改善C++程序效率的一个根本办法是以pass by reference-to-const方式传递对象。

    mutable(可变的)

    mutable释放掉non-static成员变量的bitwise constness约束。

    如下代码所示:

     1 class CTextBlock
     2 {
     3 public:
     4   ...
     5   std::size_t length() const;
     6 
     7 private:
     8   char *pText;
     9   mutable std::size_t textLength;   // 这些成员变量可能总是会被更改,即使在
    10   mutable bool lengthIsValid;       // const成员函数内。
    11 };
    12 
    13 std::size_t CTextBlock::length() const
    14 {
    15     if (!lengthIsValid) {
    16         textLength = std::strlen(pText);
    17         lengthIsValid = true;
    18     }
    19     return textLength;  
    20 }

    总结忠告:

    将某些东西声明为const可帮助编译器侦测出错误的用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

    编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。

    constnon-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

  • 相关阅读:
    Pentaho
    知识地图
    分享学习笔记本
    2015-7-1 记而随,随而记
    web 导出 csv
    vs2013 密钥
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    如何绘制业务流程图?
    总是保存下拉选项的第一个值
    mac 修改密码后 频繁输入钥匙串问题修复方法
  • 原文地址:https://www.cnblogs.com/AiLun/p/11498546.html
Copyright © 2020-2023  润新知