我们通常在定义变量的时候会对其初始化,同样,当我们定义了对象之后,也希望对对象进行初始化,对其赋值。但是我们知道类中的数据成员是私有的,不能像普通变量那样对其赋值。那么该怎样对类的对象初始化呢?对此,我们先给出如下的定义,然后再一步步解释程序的含义。
#include<iostream>
using namespace std;
class Test
{
public:
Test( )//构造函数1
{
num=0;
}
Test(int Num)//构造函数2
{
num=Num;
}
private://数据成员int num;
};
int main()
{
Test t1;//创建对象t1,并调用构造函数1为t1.num赋值为0
Test t2(10);//创建对象t2,并调用构造函数2为t2.num赋值为10
}
在主函数中我们首先创建了t1对象,为了实现在创建对象的时候对其初始化,C++提供了专门用于对对象初始化的函数——构造函数。构造函数的函数名与类名相同,而且该函数没有返回值(如上的构造函数1和构造函数2)。程序创建对象的时候,就会自动调用构造函数对对象初始化,因此,t1对象会被初始化为0(调用构造函数1)。主程序的第二行创建了另外一个对象t2,t2对象会被初始化为10(调用构造函数2)。由此,我们可以知道,构造函数的个数可以不止一个(函数的重载)。当然,我们可以在类中对函数进行声明,在类外对函数进行定义,但是,如果在类外对函数定义时,就要指出该函数属于哪个类(复杂程序不止一个类)。如下为在类外定义函数的方法:
#include<iostream>
using namespace std;
class Test
{
public:
Test();//构造函数1
Test(int Num);//构造函数2
private://数据成员
int num;
};
Test::Test()//类外定义构造函数1
{
num=0;
}
Test::Test(int Num)//类外定义构造函数2
{
num=Num;
}
void main()
{
Test t1;//调用构造函数1
Test t2(10);//调用构造函数2
}
在类外定义构造函数的时候通过::来指明函数属于哪个类。通常,假如我们不编写构造函数,系统会自动调用默认的构造函数,默认的构造函数不会做任何工作。为了验证t1对象调用构造函数1,t2对象调用构造函数2,我们将程序改为如下的形式:
#include<iostream>
using namespace std;
class Test
{
public:
Test();
Test(int Num);
private:
int num;
};
Test::Test()
{
num=0;
cout<<"construct function 1"<<endl;
}
Test::Test(int Num)
{
num=Num;
cout<<"construct function 2"<<endl;
}
void main()
{
Test t1;
Test t2(10);
}
然后再vc上运行该程序,结果如下: