一.拷贝构造函数(复制构造函数)
1)区别:
a)对象的赋值:对一个已经存在的对象赋值
b)对象的复制:从无到有地建立一个新的对象
2)拷贝构造函数的声明:类名(类名 &对象名)
例:Box (Box & box1);
调用:类名 对象(要被复制的对象名)
例: Box box1(12,15,16);
Box box2(box1);
3)调用拷贝构造函数的时机:若用户未定义拷贝构造函数,则系统提供一个默认的拷贝构造函数,用“老对象”的数据成员的值对“新对象”的数据成员一一进行赋值。(当数据成员出现new运算时,必须在类中显示定义一个拷贝构造函数!)
a)对象的复制。 Box box2 = box1; //按box1复制给box2
b)函数的参数是类的对象
c)函数的返回值是类的对象
二.小知识点
1.析构函数就算不执行操作,后面的大括号与分号也必须有。(否则就变成了只有声明,没有后续)
例:~类名(){;}
2.利用形式参数为指针访问私有数据成员时,注意:指针变量赋值一个常数时要加*取值。
#include <bits/stdc++.h>
using namespace std;
class Data
{
int year,month,day;
public:
Data(int y,int m,int d) //定义构造函数
{
year = y;
month = m;
day = d;
}
Data(const Data&data) //定义拷贝构造函数
{
year = data.year;
month = data.month;
day = data.day;
}
void display()//定义dispaly公有函数
{
cout<<"year:"<<year<<endl;
cout<<"month:"<<month<<endl;
cout<<"day:"<<day<<endl;
}
void set_ymd(int y,int m,int d)//通过公有成员函数对私有数据成员赋值
{
y = year;
m = month;
d = day;
}
int set_y(int y) //通过函数返回值类型为引用的成员函数对私有数据成员赋值
{
year = y;
return y;
}
int set_m(int m)
{
month = m;
return m;
}
int set_d(int d)
{
day = d;
return d;
}
int yy(){//利用函数返回值访问私有数据成员;
return year;
}
int mm() {
return month;
}
int dd() {
return day;
}
void get_ymd(int *py,int *pm,int *pd)//利用形式参数为指针访问私有数据成员;
{
*py = year;
*pm = month;
*pd = day;
}
void getS_ymd(int &py,int &pm,int &pd)//利用形式参数为引用访问私有数据成员。
{
py = year;
pm = month;
pd = day;
}
~Data(){;}//定义析构函数
};
class Time
{
int hour,minute,second;
public:
Time(int h,int m,int s) //定义构造函数
{
hour = h;
minute = m;
second = s;
}
Time(const Time&time) //定义拷贝构造函数
{
hour = time.hour;
minute = time.minute;
second = time.second;
}
void display()//定义dispaly公有函数
{
cout<<"hour:"<<hour<<endl;
cout<<"minute:"<<minute<<endl;
cout<<"second:"<<second<<endl;
}
void set_hms(int h,int m,int s)//通过公有成员函数对私有数据成员赋值
{
h = hour;
m = minute;
s = second;
}
int set_h(int h) //通过函数返回值类型为引用的成员函数对私有数据成员赋值
{
hour = h;
return h;
}
int set_m(int m)
{
minute = m;
return m;
}
int set_s(int s)
{
second = s;
return s;
}
int hh() {//利用函数返回值访问私有数据成员;
return hour;
}
int mm() {
return minute;
}
int ss() {
return second;
}
void get_hms(int *ph,int *pm,int *ps)//利用形式参数为指针访问私有数据成员;
{
*ph = hour;
*pm = minute;
*ps = second;
}
void get_hms(int &ph,int &pm,int &ps)//利用形式参数为引用访问私有数据成员。
{
ph = hour;
pm = minute;
ps = second;
}
~Time(){;}//定义析构函数
};
int main()
{
int year,month,day,hour,minute,second;
cout<<"请输入年月日:"<<endl;
cin>>year>>month>>day;
cout<<"请输入时分秒:"<<endl;
cin>>hour>>minute>>second;
Data data2(year,month,day);//声明类(调用构造函数)
Time time2(hour,minute,second);
// Data data(data2); //调用拷贝构造函数
// Time time(time2);
// data2.set_ymd(year,month,day);//通过公有成员函数对私有数据成员赋值;
// time2.set_hms(hour,minute,second);
// data2.set_y(year); //通过函数返回值类型为引用的成员函数对私有数据成员赋值
// data2.set_m(month);
// data2.set_d(day);
// time2.set_h(hour);
// time2.set_m(minute);
// time2.set_s(second);
// year = data2.yy() ;//利用函数返回值访问私有数据成员;
// month = data2.mm() ;
// day = data2.dd() ;
// hour = time2.hh() ;
// minute = time2.mm() ;
// second = time2.ss() ;
// data2.get_ymd(&year,&month,&day);//利用形式参数为指针访问私有数据成员;
// data2.get_hms(&hour,&minute,&second);
// data2.getS_ymd(year,month,day);//利用形式参数为引用访问私有数据成员。
// time2.getS_hms(hour,minute,second);
data2.display();//调用dispaly公有函数
time2.display();
return 0;
}