类属于一种用户自定义的数据类型,在声明一个对象的时候,编译程序要为对象分配存储空间,进行必要的初始化,这些工作是由构造函数来完成的.简单理解,构造函数就是用来对数据成员进行初始化的。
与构造函数相对应的是析构函数,它们之间的关系很像"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; }
结果:
用对象来初始化对象本质上和用一般数据来初始化对象一样,因为对象很像是一种用户自定义的数据类型,它的使用和一般数据类型一样。