参考:http://www.weixueyuan.net/view/6340.html
总结:
参数初始化表可以为任何数据成员进行初始化。
初始化const成员变量的唯一方法只有利用参数初始化表。
通过上一节,我们知道构造函数的主要用途就是初始化对象的,除了采用上节所讲述的那种在函数体中一一赋值的方法外,通过参数初始化表同样可以对对象进行初始化,请看下面的代码(例1):
如本例所示,本例在定义带参构造函数book(char *a, double p)时,不再是在函数体中一一赋值进行初始化,其函数体为空。在函数首部与函数体之间增添了一个冒并加上title(a),price(p)语句,这个语句的意思相当于函数体内部的 title = a; price = p; 语句。这样做对于两个成员变量的类来说看不出什么优势,但是一旦当成员变量非常多的时候,通过参数初始化列表进行初始化其优势便可以显现出来了,如此写法简洁明了。
参数初始化表还有一个很重要的作用,那就是为const成员变量初始化。
[例2] 不能在函数体内部初始化 const 变量:
在本例中Array类声明了两个成员变量,length和num指针,需要注意的是length加了const关键字修饰。此时默认构造函数再为length赋值为0,这是无法通过编译的。
初始化const成员变量的唯一方法只有利用参数初始化表。
[例3] 通过参数初始化表初始化 const 变量:
如例3所示,利用参数初始化表为const成员变量进行初始化。参数初始化表可以为任何数据成员进行初始化,如下所示,参数初始化表同样可以为num初始化。
使用参数初始化表还需要注意的是,参数初始化顺序与初始化表列出表量的顺序无关,参数初始化顺序只与成员变量在类中声明的顺序有关。
- 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){}
参数初始化表还有一个很重要的作用,那就是为const成员变量初始化。
[例2] 不能在函数体内部初始化 const 变量:
- class Array
- {
- public:
- Array()
- {
- length = 0; //compile error
- num = NULL;
- };
- private:
- const int length;
- int * num;
- };
初始化const成员变量的唯一方法只有利用参数初始化表。
[例3] 通过参数初始化表初始化 const 变量:
- class Array
- {
- public:
- Array(): length(0)
- {
- num = NULL;
- };
- private:
- const int length;
- int * num;
- };
- class Array
- {
- public:
- Array():length(0){num = NULL;}
- Array(int * a): num(a), length(5){}
- private:
- const int length;
- int * num;
- };