/********************computer.h*********************************************/
#include <iostream.h>
enum CPU_Rank{p1,p2,p3,p4,p5,p6,p7};
class CPU
{
private:
static int no; //no,cpu_id 用于试验,记录每个对象独有的id,no就是用于保证每个建立的对象有一个独有id
int cpu_id;
CPU_Rank rank;
float frequence,voltae;//频率,电压
public:
CPU(CPU_Rank r,float f,float v)
{
rank=r;
frequence=f;
voltae=v;
no++;
cpu_id=no;
cout<<"CPU:"<<cpu_id<<"begin!"<<endl;
}
CPU()
{
no++;
cpu_id=no;
cout<<"CPU:"<<cpu_id<<"begin!"<<endl;
}
~CPU()
{
cout<<"CPU:"<<cpu_id<<"stop!"<<endl;
}
CPU(CPU &c)//拷贝构造函数,参数类型必须是引用
{
rank=c.rank;
frequence=c.frequence;
voltae=c.voltae;
no++;
cpu_id=no;
cout<<"CPU:"<<cpu_id<<"begin!"<<endl;
}
};
int CPU::no=0;//为静态变量初始化
class Computer
{
private:
CPU cpu;
public:
Computer(CPU c):cpu(c)
{}
};
/********************computer.cpp*********************************************/
#include <iostream.h>
#include "computer.h"
int main()
{
CPU c1;
CPU c2(c1);
CPU c3(p1,1500.0,2.5);
return 0;
}
/********************结果*****************************************************/
由于构造函数在对象生成的时候,第一时间被调用,所以,构造函数的顺序和对象生产地顺序是一样的,但是析构函数正好相反。
/****************************更改computer.cpp文件******************************/
#include <iostream.h>
#include "computer.h"
int main()
{
CPU c1;
Computer com1(c1);
return 0;
}
/**************运行结果*******************************************************/
结果分析:CPU1是由对象c1生成地,CPU2则由Computer构造函数的形参生成的,由于形参也是一个CPU类对象,所以会调用了类的构造函数,CPU3则是com1.cpu生成的,com1.cpu是com1的成员(CPU类)。Computer构造函数的定义:Computer(CPU c):cpu(c)
{},其中cpu(c)实为CPU类的拷贝构造函数,在CPU类里面,已经自定义了一个拷贝构造函数,定义如下:
CPU(CPU &c)//拷贝构造函数,参数类型必须是引用
{
rank=c.rank;
frequence=c.frequence;
voltae=c.voltae;
no++;
cpu_id=no;
cout<<"CPU:"<<cpu_id<<"begin!"<<endl;
}
里面也记录了cpu_id(CPU的id)。
这里,发现了一个问题,CPU2比CPU3早被系统销毁,这是因为CPU2是形参,它的生命周期就是Computer的构造函数运行周期,当构造函数调用结束后,CPU2也就跟着被销毁,而CPU3即com1.cpu,是main()函数的数据成员。
如果把CPU类的拷贝构造函数注释掉会怎样呢?
从结果中,我们可知有三个CPU类对象被生产,但是对象的cpu_id却没有随着更改。本来构造函数里有更改cpu_id数值并打印出来的功能,第一行应该是CPU1打印出来的,由于自定义的拷贝函数被注释掉了,所以类对象会自动调用系统默认的拷贝构造函数,该函数只是简单的对对象各个数据成员进行相应的赋值而已,并没有更改cpu_id和打印的功能。结合上一个例子,可以看出,实参对象给形参对象传数据时,应该也是使用拷贝构造函数(个人看法)。
总结:这是2009-12-23号C++试验课的课后笔记,给我很大的启发,看来对C++我还没学到家。