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;
}

 

posted @ 2015-05-07 17:50  碎语心弦  阅读(257)  评论(0编辑  收藏  举报