提到构造函数,必须明确以下几个概念
1,构造函数的作用是什么?
答案是----构造函数是为了实现对象的初始化。
2,必须要使用构造函数才能完成对象的初始化吗?
答案是----是的,必须这样。为什么如此肯定是基于这样一个事实,C++所拥有的类具有与C语言结构体有着与生俱来的差别。我们知道C的结构体没有“数据权限”这样一个说法,一个结构体所定义的各种不同类型的数据是“敞开”的,我们可以直接访问每一种数据。但是C++的类因为引入了“权限”这个概念,似的很多数据在类声明的时候就已经定义为private,所以对于这样的私有的数据我们是无法直接访问的,更不谈直接初始化了。至于C++为何要引入权限这个东西,官方的回答是为了安全。
下面直接来一个实际的例子认识一下构造函数,并且只讨论带参数的构造函数这特殊的一种,因为这个比较常见。
#include <iostream>
using namespace std;
class Box
{
public:
Box(int,int,int);
int volume();
private:
int height;
int width;
int length;
};
Box::Box(int h, int w, int len)
{
height = h;
width = w;
length = len;
}
int Box::volume()
{
return height*width*length;
}
int main()
{
Box box1(12,25,30);
cout << "the volume of box1 is: " << box1.volume() << endl;
Box box2(15,30,21);
cout << "the volume of box2 is: " << box2.volume() << endl;
return 0;
}
该程序的输出结果为:
下面来分析源程序的几个关键地方,
第7行即为构造函数的声明,我们发现它具备以下特征:
1,构造函数与类同名;
2,构造函数没有返回值,没有返回数据类型,类型也不是void;
第14行是构造函数的函数体,"::"这个符号是作用域标示符,在C++中这个符号的意义为限定本符号右边的东西隶属于符号左边的类,仅仅只是左边这个类的成员。
第27行,Box类定义了一个对象box1,然后直接就传递了三个参数过去。乍一看这里觉得很迷糊,怎么可以这样搞,其实习惯了也就无所谓了,关于带参数的构造函数采用这样一种在定义对象时直接传递参数的方式去初始化对象可以理解为这种类型构造函数的固定用法或者标准用法。至于为什么,也是后来学习过程中会讨论的一个热门话题就是----构造函数不能被显示调用。看到这句话再结合前面介绍构造函数的特点,可以看出,构造函数跟我们通常的函数是不同的,至少已经不是普通函数的那种惯常的使用方式了。不管怎么样,至少像第27行那样的使用方式必须要掌握。