类属于一种用户自定义的数据类型,在声明一个对象的时候,编译程序要为对象分配存储空间,进行必要的初始化,这些工作是由构造函数来完成的.简单理解,构造函数就是用来对数据成员进行初始化的。
与构造函数相对应的是析构函数,它们之间的关系很像"new"和“delete”的关系,而且它们的声明和最后的销毁也是想new和delete那样对应的。析构函数用来收回存储空间,完成一些善后的工作.
构造函数使用的一些注意事项:
1,构造函数名字必须与类名相同。
2,构造函数不指定返回值,但有隐含返回值,就是说返回值这里可以先不用考虑。
3,构造函数可以重载。
4,调用构造函数对类对象初始化时,先执行初始化列表中的数据成员,再执行构造函数体中的内容。初始化列表中数 据成员的初始化顺序与类体中定义的顺序相同。
尤其要注意的是第4条中初始化列表中数据成员的初始化顺序。
构造函数的示例:
#include<iostream>
using namespace std;
class Date //定义一个日期类
{
public:
Date(int y,int m,int d); //带有3个参数的构造函数
Date(int y=2000):year(y) //默认的构造函数
{
month=10;
day=1;
cout<<"Constructor of Date with 1 parameter. "<<endl;
}
~Date(){cout<<"Destructor of Date:"<<year<<"."<<month<<"."<<day<<endl;} //析构函数
int IsLeapYear(); //判断闰年
void Print(){cout<<year<<"."<<month<<"."<<day<<endl;} //打印出年月日
private:
int year,month,day;
};
Date::Date(int y,int m,int d):year(y),month(m),day(d) //带有3个参数的构造函数的定义
{
cout<<"Constructor of Date with 3 Parameters."<<endl;
}
int Date::IsLeapYear() //判断闰年的函数的定义
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int main() //主函数
{
Date date1(2002,10,1),date2; //声明两个Date类型的变量,分别为date1,date2,其中date1调用带有3个参数的构造函数,date2调用默认的构造函数。
cout<<"date1:";
date1.Print(); //打印出date1的年月日
cout<<"date2:";
date2.Print(); //打印出date2的年月日
//判断date2是否是闰年
if(date2.IsLeapYear()) cout<<"date2 is a leapyear."<<endl;
else cout<<"date2 is not a leapyear."<<endl;
return 0;
}
结果:

需要调用的是,构造函数的调用与析构函数相反,这两个东西看起来类似于VB中form_load和form_unload,但是 使用形式上更像进栈和出栈,先进后出,先调用构造函数的对象后被销毁。
在调用构造函数时,除了用传统的数据类型,比如int,double型数据进行对象的初始化外,还可以用一个已知的对象来初始化一个正在创建的同类对象,这种特殊的构造函数叫做复制的构造函数。
例如:
#include<iostream>
using namespace std;
class Date //定义一个Date类
{
public:
Date(int y,int m,int d); //3参数的构造函数
Date(int y=2000):year(y) //1个参数的构造函数
{
month=10;
day=1;
cout<<"constructor of date with 1 parameter."<<endl;
}
Date(const Date& d); //复制的构造函数
~Date(){cout<<"destructor of date:"<<year<<'.'<<month<<'.'<<day<<endl;} //析构函数
int IsLeapYear(); //判断闰年
void Print(){cout<<year<<"."<<month<<"."<<day<<endl;} //打印年月日
private:
int year,month,day;
};
Date::Date(int y,int m,int d):year(y),month(m),day(d) //3参数的构造函数定义
{
cout<<"constructor of date with 3 parameters."<<endl;
}
Date::Date(const Date& d) //复制的构造函数
{
year=d.year ;
month=d.month ;
day=d.day ;
cout<<"copy constructor of date."<<endl;
}
int Date::IsLeapYear() //判断闰年
{
return (year%4==0 && year%100!=0)||(year%400==0);
}
int main()
{
Date date1(2002,10,1); //定义date1
Date date2(date1); //用date1来初始化date2
cout<<"date1: ";
date1.Print();
cout<<"date2: ";
date2.Print();
return 0;
}
结果:

用对象来初始化对象本质上和用一般数据来初始化对象一样,因为对象很像是一种用户自定义的数据类型,它的使用和一般数据类型一样。