在C++中尽可能用const

来源:互联网 发布:形容男生的网络词语 编辑:程序博客网 时间:2024/04/30 20:10

本文是关于C++中const的一些用法及其含义的探讨。

尽可能用const替换#define

#define指定的记号会在预编译时期进行替换,没有进入编译时期的符号表(symbol table)里,会存在潜伏的隐患。

#define BufferSize 65536const int BufferSize = 65536;

上面定义了BufferSize,用const修饰可以让编译器帮我们对变量进行类型检查,若编译出错,编译器可以为我们提供更有用的提示信息,而不仅仅是一个数字65536。 另外,#define是简单的记号替换,可能导致目标码中65535出现多份,造成额外的码量,const则不会出现这样的情况。

const修饰的对象

const可以修饰global和namespace中定义的常量
修饰class中声明的成员变量,成员函数
修饰函数内部定义的局部对象
修饰函数的返回值,修饰函数的参数

const int BufferSize = 65536;  // 全局常量namespace om{const int OrderSize = 1e6;  // 命名空间内部常量class Order{public:  void init(const Order& order)  {    // 函数内部const data    const double initPrice = order.getPrice();    // todo  }  // const 成员函数,  // 需注意const成员函数不能改变成员变量或者调用non-const成员函数,  // 若无法避免要修改成员变量,可将成员变量声明为mutable  const double getPrice() const  {    return mPrice;  }  // 参数类型是const double  void setPrice(const double price)  {    // 参数price是只读的,不应该被改变    mPrice = price;  }  // 返回类型是const Order&  const Order& operator+=(const Order& order)  {    this->mPrice += order.getPrice();    return *this;  }  const std::string& toString() const  {    // 由于mString是mutable的,const 成员函数也能修改,    // 这样设计仅仅是为了举例说明non-const的toString()可以调用    // const toString()而避免重复代码,减少代码维护难度    mString = "";    mString += "price:" + std::to_string(mPrice);    return mString;  }  std::string& toString()  {    // 调用const toString()避免重复代码    return const_cast<std::string&>(        static_cast<const Order&>(*this).toString());  }public:  static const int OrderType = 10;  // const 成员变量private:  double mPrice;  mutable std::string mString;  // const成员函数也能修改该变量};}
1 0