复制构造函数 是用来将一个对象复制到新创建的对象当中,是内容的拷贝,
函数原型通常如下
ClassName(const ClassName &);
何时调用复制构造函数
新建一个对象,并将其初始化为现有同类对象时,复制构造函数将会被调用
每当程序生成了对象的副本时,都会显示调用复制构造函数
代码
此处并未写复制构造函数,他被注释起来了
头文件声明
#ifndef __STUDENT_H__
#define __STUDENT_H__
class STUDENT
{
private:
static int Amount;
int nID;
int nAge;
public:
STUDENT();//无参构造函数
STUDENT(int ID, int Age);//构造函数
// STUDENT(const STUDENT &Temp);//复制构造函数
~STUDENT();//析构函数
void SetID(int ID);
void SetnAge(int Age);
int GetAmount(void);
int GetID(void);
int GetAge(void);
};
源文件的定义
#include "stdafx.h"
#include "Student.h"
int STUDENT::Amount = 0;
STUDENT::STUDENT()//无参构造函数
{
Amount++;
}
STUDENT::STUDENT(int ID, int Age)//构造函数
{
nID = ID;
nAge = Age;
Amount++;
}
//STUDENT::STUDENT(const STUDENT &Temp);//复制构造函数
STUDENT::~STUDENT()//析构函数
{
Amount--;
}
void STUDENT::SetID(int ID)
{
nID = ID;
}
void STUDENT::SetnAge(int Age)
{
nAge = Age;
}
int STUDENT::GetAmount(void)
{
return Amount;
}
int STUDENT::GetID(void)
{
return nID;
}
int STUDENT::GetAge(void)
{
return nAge;
}
main
#include "stdafx.h"
#include "Student.h"
int main(int argc, char* argv[])
{
STUDENT a;
cout<<a.GetAmount()<<endl;
STUDENT b;
cout<<b.GetAmount()<<endl;
STUDENT c = b;
cout<<c.GetAmount()<<endl;
return 0;
}
运行结果
程序说明,当声明一个类对象,且并未给其初始化为现有对象时,他将使用构造函数,所以Amount的值会+1,但是在第三个类对象c的时候,将其显示的初始化为现有类对象b,他将调用编译器提供的默认复制构造函数,所以Amount的值并未改变
加入复制构造函数
STUDENT::STUDENT(const STUDENT &Temp)//复制构造函数
{
Amount++;
nID = Temp.nID;
nAge = Temp.nAge;
cout<<"复制构造函数"<<endl;
}
STUDENT STUDENT::Copy(const STUDENT &a)//程序生成一个对象的副本
{
return a;
}
main
int main(int argc, char* argv[])
{
STUDENT a;
cout<<a.GetAmount()<<endl;
STUDENT b;
cout<<b.GetAmount()<<endl;
STUDENT c = b;
cout<<c.GetAmount()<<endl;
a = c.Copy(a);
return 0;
}
结果说明:当我们自己写了复制构造函数时,那么当用已有对象显示初始化新对象的时候,那么会调用我们自己的写的复制构造函数,然后最重要的一点,当生成对象副本的时候,也会调用显示构造函数