const关键字
const关键字的语义
简单地说,const关键字将修饰一个量为“常量”,即不可变动的量。这个量在C++中可以是基本类型变量、类对象、指针、对象引用、类成员函数。
const变量
• C++标准规定:const关键字放在类型或变量名之前等价的:
const int n = 5; <==> int const n = 5; const int *p = NULL; <==> int const *p = NULL;
• Bjarne在《The C++ Programming Language》书中给出过一个助记方法: 把一个const声明从右向左读,*号读成pointer to:
char * const p; // p is a const pointer to char const char * p; // p is a pointer to const char char ** p; // p is a pointer to pointer to char const char ** p; // p is a pointer to pointer to const char char * const * p; // p is a pointer to const pointer to char const char * const * p; // p is a pointer to const pointer to const char char ** const p; // p is a const pointer to pointer to char const char ** const p; // p is a const pointer to pointer to const char char * const * const p; // p is a const pointer to const pointer to char const char * const * const p; // p is a const pointer to const pointer to const char
const成员函数
类的const成员函数表示该成员函数对类成员拥有只读权限而没有写权限。一个类的对象分为常量对象和非常量对象,而类的成员函数也分成常量函数和非常量函数。两者的互相调用关系如下:
• 非常量对象可以调用常量函数;
• 非常量对象可以调用非常量函数;
• 常量对象不可以调用非常量函数;
• 常量对象可以调用常量函数;
类的const成员变量初始化
这里所谓的类const成员变量,其实包括了类实例的const成员变量和类的const静态变量两种情况,下面用一个例子来说明应该如果初始化这两种const变量。
#include <string> #include <iostream> using namespace std; class Test { public: static int STATIC_NUMBER; // 基本类型静态变量 static string STATIC_STRING; // 对象类型静态变量 const static int CONST_STATIC_NUMBER; // 基本类型常量静态变量 const static string CONST_STATIC_STRING; // 对象类型常量静态变量 public: const int m_Number; // 基本类型变量 const string m_String; // 对象类型变量 public: Test(int n, string s) : m_Number(n), m_String(s) // 正确:构造函数初始化列表中初始化 { // m_Number = n; // 错误:构造函数体中初始化 // m_String = s; // 错误:构造函数体中初始化 } ~Test() {} }; // 普通静态变量初始化 int Test::STATIC_NUMBER = 1; string Test::STATIC_STRING = "static string"; // 常量静态变量初始化 const int Test::CONST_STATIC_NUMBER = 2; const string Test::CONST_STATIC_STRING = "const static string"; int main() { return 1; }