前言
复制构造函数是一种重载版本的构造函数,它是用一个已存在的对象初始化另一个新创建的同类对象。
一、复制构造函数声明
类名(const 类名&对象名);
二、复制构造函数的自动调用
1.系统自动调用的三种情况
①明确表示由一个已定义的对象初始化一个新对象。
②函数的形式参数为一个对象,当发生函数调用、对象作为实参传递给函数形参时,注意,如果形式参数时引用或指针,就不会调用复制构造函数,因为此时不会产生新对象。
③对象作为函数返回值。
2.代码如下(示例):
.h文件(定义CDate类)
#pragma once
#include<iostream>
using namespace std;
class CDate
{
int Date_Year, Date_Month, Date_Day;
public:
CDate(int y = 2000, int m = 1, int d = 1);//声明构造函数,带参数
CDate(const CDate &date);//声明复制构造函数
void Display();
};
.cpp文件(CDate类成员函数)
#include"D:\VScode\gouzaohanshu\copy.h"
using namespace std;
CDate::CDate(int y, int m, int d) :Date_Year(y), Date_Month(m), Date_Day(d)//构造函数的定义
{
cout << "构造函数" << endl;
}
CDate::CDate(const CDate& date)//复制构造函数的定义
{
Date_Year = date.Date_Year;
Date_Month= date.Date_Month;
Date_Day= date.Date_Day+1;//只要使用一次复制构造函数 ,日期延后一天
cout << "copy构造函数" << endl;
}
void CDate::Display()//显示函数的定义
{
cout << Date_Year <<"-"<< Date_Month <<"-"<< Date_Day << endl;
}
.cpp文件(验证不同情况下调用不同的构造函数)
#include<D:\VScode\gouzaohanshu\copy.h>
CDate fun(CDate newdate1)//对象(eg.CDate newdate1)作为某个函数(CDate fun)的形参,
//当发生函数调用、对象作为实参传递给函数形参时,自动调用copy构造函数------类型2
{
CDate newdate2(newdate1);//调用copy构造函数------- 类型1(明确让一个对象 = 另一个对象)
return newdate2;//作为返回值自动调用copy构造函数-------类型3
}
int main()
{
CDate day1(2019, 3, 9);//通过构造函数初始化,实参优先于形参,显示2019—3—9
CDate day3;//无实参,构造函数初始化后,使用默认值,显示2000-1-1
CDate day2(day1);//调用copy构造函数-------类型1(明确让一个对象=另一个对象)
day2.Display();
CDate day4 = day2;//调用copy构造函数------类型1(明确让一个对象=另一个对象)
day3 = day2;//简单赋值,没有调用任何构造函数,此时day3=2019-3-10
day3 = fun(day2);//通过fun函数,调用了3次copy构造函数
day3.Display();//显示为2019-3-13
return 0;
}
总结
复制构造函数属于浅复制,仅仅是一个地址值,没有另外申请动态空间