1.什么是构造函数?
构造函数也是类的成员函数,但是它是一种特殊的的成员函数。主要用来创建对象时初始化对象,为对象初始化赋值。
它总是与new运算符一起使用在创建对象的语句中。
特别是一个类可以有多个构造函数可以根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
它的特征:
1>构造函数的名字必须与类名相同。
2>构造函数不指定换回类型,他隐含有返回值,由系统内部使用。
3>构造函数可以重载
4>在创建对象时系统会自动调用构造函数。
2.什么是析构函数?
析构函数也是类中的一种特殊的成员函数,他的作用于构造函数相反,用来撤销对象。
它的特征:
1>析构函数的名字是类名前面加求反~符号
2>构造函数不指定换回类型,他隐含有返回值,由系统内部使用。
3>析构函数没有参数,因此不能重载,一个类只能定义一个析构函数
4>在撤销对象时,系统自动调用析构函数。
3.什么是缺省构造函数和缺省析构函数?
缺省构造函数就是调用时不必提供参数的构造函数。缺省构造函数的函数名与类名相同,它的参数表为空或者他的所有参数都有默认值。
如果一个类中没有定义任何构造函数,那么编译器会生成一个不带任何参数的公有缺省构造函数。
每个类都必须有一个析构函数,如果一个类中没有声明析构函数,那么编译器也会生成一个公有缺省析构函数。
4.什么是拷贝构造函数?
它用一个已知的对象初始化一个正在创建的同类对象。
它的特点:
1>它也是一种构造函数,函数名与类名相同,并且不能指定函数返回类型。
2>只有一个参数,是对同类的对象的引用。
3>每一个类中都必须有一个拷贝构造函数,如果没有声明,编译器会自动生成一个公有的拷贝构造函数。
#include <iostream>
using namespace std;
class Date
{
public:
//构造函数
//2个参数构造函数
Date(int y,int m)
{
year=y;
month=m;
day=21;
cout<<"我是默认构造函数"<<endl;
}
//一个缺省的构造函数
Date()
{
year=month=day=0;
cout<<"我是默认构造函数"<<endl;
}
//三个参数的构造函数
Date(int y,int m,int d)
{
year=y;
month=m;
day=d;
cout<<"我是3构造函数"<<endl;
}
//拷贝构造函数
Date(const Date& d)//拷贝构造函数最好加上const
{
year=d.year;
month=d.month;
day=d.day;
cout<<"我是拷贝构造函数"<<endl;
}
//析构函数
~Date()
{
cout<<"我是析构函数"<<endl;
}
void Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
int IsLeapYear();
private:
int year,month,day;
protected:
};
inline int Date::IsLeapYear()
{
return ((year%4==0&&year%100!=0) || year%400==0);
}
int main()
{
/*
//对象的定义
Date date1,date2;//定义了两个一般对象
Date dates[31];//定义了一个对象数组,这个数组有31个元素,每个元素都是一个Date对象。
Date* pdate;//pdate是一个指向Date对象的指针
Date& date3=date1; //date3是date1对象的引用,定义时必须进行初始化 */
Date date1(2012,12,24);
Date dates[2]={
Date(2011,1,1)
};
/*
下面的相当于建立了一个匿名对象tmp
Date tmp(2013,7,24);
dates[1]=tmp;
释放tmp;
*/
dates[1]=Date(2013,7,24);
cout<<"date2:";
dates[1].Print();
Date date3(date1);
cout<<"date3:";
date3.Print();
return 0;
}