原理:
1、当用一个已知对象构造一个新的对象时需要调用拷贝构造函数。如果一个类的成员含有指针类成员,需要显示定义拷贝构造函数(深拷贝)。
2、当一个类的成员中包含其他类的对象时称为类的组合,这些类成员通常称为子对象,子对象的构造需要调用子对象自己的构造函数。
参考代码:
#include <iostream>
using namespace std;
enum CPU_Rank { p1 = 1, p2, p3, p4, p5, p6, p7 }; // 定义一个枚举类型
class CPU
{
private: // 私有属性定义
CPU_Rank rank; // 等级
int freauency; // 频率
float voltage; // 电压
public:
// 将两个重构函数进行结合
// CPU(); // 无参构造函数
CPU(CPU_Rank r = p5, int f = 1024, float v = 3.6) // 带默认参数的构造函数声明
{
rank = r; freauency = f; voltage = v;
cout << "CPU类的构造函数调用..." << endl;
}
void output()
{
cout << "Rank=" << rank << endl;
cout << "Freauency" << freauency << endl;
cout << "Voltage" << voltage << endl;
}
CPU(const CPU &c) // CPU类的拷贝构造函数
{
cout << "CPU类拷贝构造函数调用..." << endl;
}
~CPU() // CPU类的析构函数
{
cout << "CPU类析构函数调用..." << endl;
}
};
// 类RAM
class RAM
{
private:
int rank;
int size;
public:
// 带默认参数的构造函数实现
RAM(int r = 4, int s = 1024)
{
rank = r; size = s;
cout << "RAM类的构造函数调用..." << endl;
}
void output()
{
cout << "Rank=" << rank << endl;
cout << "Size=" << size << endl;
}
RAM(const RAM& R) // RAM类的拷贝构造函数
{
cout << "RAM类拷贝构造函数调用..." << endl;
}
~RAM() // RAM类的析构函数
{
cout << "RAM类析构函数调用..." << endl;
}
};
// 类CDROM
class CDROM
{
private:
int rank;
int size;
public:
CDROM(int r = 4, int s = 1024)
{
rank = r; size = s;
cout << "CDROM类的构造函数调用..." << endl;
}
void output()
{
cout << "Rank=" << rank << endl;
cout << "Size=" << size << endl;
}
CDROM(const CDROM& c) // CDROM类的拷贝构造函数
{
cout << "CDROM类拷贝构造函数..." << endl;
}
~CDROM() // CDROM的析构函数
{
cout << "CDROM类析构函数..." << endl;
}
};
// 计算机大类
class Computer
{
private:
CPU cpu; // 组合成员:一个类的数据成员为另一个类的对象
RAM ram; // 组合成员
CDROM cdrom; // 组合成员
public:
// 计算机大类的构造函数
/*
调用此构造函数时隐含分别两次调用三个组合对象的拷贝构造函数和
一次调用它们的析构函数(WHY????)
*/
Computer(CPU c1,RAM r,CDROM c2):ram(r),cpu(c1),cdrom(c2)
{
cout << "Computer类构造函数调用..." << endl;
}
~Computer() // Computer类的析构函数
{
cout << "Computer类析构函数调用..." << endl;
}
};
// 主函数
void main()
{
CPU cpu1(p2, 4096, 4.8); //调用带参数的构造函数声明对象cpu1
cpu1.output();
cout << "-----------------------" << endl;
RAM ram1(6,768); //调用带参数的构造函数声明对象ram1
ram1.output();
cout << "-----------------------" << endl;
CDROM cdrom1(6,768); //调用带参数的构造函数声明对象cdrom1
cdrom1.output();
cout << "-----------------------" << endl;
Computer cp(cpu1, ram1, cdrom1);
cout << endl << "让我来康康变化最后的结果是啥呢?" << endl << endl;
}