构造函数和析构函数的课后笔记

 

/********************computer.h*********************************************/

#include <iostream.h>

enum CPU_Rank{p1,p2,p3,p4,p5,p6,p7};

class CPU

{

private:

       static int no;      //no,cpu_id 用于试验,记录每个对象独有的idno就是用于保证每个建立的对象有一个独有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.cpucom1的成员(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_idCPUid)。

这里,发现了一个问题,CPU2CPU3早被系统销毁,这是因为CPU2是形参,它的生命周期就是Computer的构造函数运行周期,当构造函数调用结束后,CPU2也就跟着被销毁,而CPU3com1.cpu,是main()函数的数据成员。

如果把CPU类的拷贝构造函数注释掉会怎样呢?

 

从结果中,我们可知有三个CPU类对象被生产,但是对象的cpu_id却没有随着更改。本来构造函数里有更改cpu_id数值并打印出来的功能,第一行应该是CPU1打印出来的,由于自定义的拷贝函数被注释掉了,所以类对象会自动调用系统默认的拷贝构造函数,该函数只是简单的对对象各个数据成员进行相应的赋值而已,并没有更改cpu_id和打印的功能。结合上一个例子,可以看出,实参对象给形参对象传数据时,应该也是使用拷贝构造函数(个人看法)。

 

总结:这是2009-12-23C++试验课的课后笔记,给我很大的启发,看来对C++我还没学到家。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值