C++参数初始化表

通过上一节,我们知道构造函数的主要用途就是初始化对象的,除了采用上节所讲述的那种在函数体中一一赋值的方法外,通过参数初始化表同样可以对对象进行初始化,请看下面的代码(例 1):
class book
{
public:
    book(){}
    book(char* a, double p);
    void setprice(double a);
    double getprice();
    void settitle(char* a);
    char * gettitle();
    void display();
private:
    double price;
    char * title;
};

book::book(char *a, double p):title(a),price(p){}
本例在定义带参构造函数 book(char *a, double p) 时,不再是在函数体中一一赋值进行初始化,其函数体为空。在函数首部与函数体之间增添了一个:冒号并加上title(a),price(p)语句,等同于在函数体内部写title = a; price = p;语句,这种初始化对象的方式就称为参数初始化表。

对于两个成员变量的类来说,参数初始化表看不出什么优势,但是一旦当成员变量非常多的时候,通过参数初始化表进行初始化的优势就显现出来了,如此写法简洁明了。

参数初始化表还有一个很重要的作用,那就是为 const 成员变量初始化。

【例 2】不能在函数体内部初始化 const 变量:
class Array
{
public:
    Array()
    {
        length = 0; //compile error
        num = NULL;
    };
private:
    const int length;
    int * num;
};
在本例中,Array 类声明了两个成员变量,length 和 num 指针,需要注意的是 length 加了 const 关键字修饰。此时默认构造函数再为 length 赋值为 0,这是无法通过编译的。

初始化 const 成员变量的唯一方法只有利用参数初始化表。

【例 3】通过参数初始化表初始化 const 变量:
class Array
{
public:
    Array(): length(0)
    {
        num = NULL;
    };
private:
    const int length;
    int * num;
};
如例 3 所示,利用参数初始化表为 const 成员变量进行初始化。参数初始化表可以为任何数据成员进行初始化,如下所示,参数初始化表同样可以为 num 初始化。
class Array
{
public:
    Array():length(0){num = NULL;}
    Array(int * a): num(a), length(5){}
private:
    const int length;
    int * num;
};
使用参数初始化表还需要注意的是,参数初始化顺序与初始化表列出表量的顺序无关,参数初始化顺序只与成员变量在类中声明的顺序有关。