第九周练习 阅读程序

/* 
 *Copyright(c) 2016,烟台大学计算机学院 
 *All rights reserved. 
 *作    者:刘金石 
 *完成日期:2016年4月28日 
 *版本  号:v1.0 
 *问题描述:阅读程序
*/  
#include <iostream>
using namespace std;
class A
{
public:
    A(){cout<<"A";}
    ~A(){cout<<"~A";}
};

class B
{
    A *p;//定义一个指向A类对象的指针
public:
    B()
    {
        cout<<"B";
        p=new A();//为类A创建一个对象大小的内存
    }
    ~B()
    {

        cout<<"~B";
        delete p;//释放p
    }
};
int main()
{
    B obj;
    return 0;
}

运行结果:


运行过程描述:

            在程序B中定义了一个指向A类的指针P。程序开始在main函数中创建B对象obj,然后调用B的构造函数,输出B,同时

创建一个A对象大小的内存并把首地址赋给指针P,这相当于创建了一个A类的对象,接着调用A的构造函数,输出A,然后程序自动调用析构函数,由于程序中只定义了一个B类对象obj,所以先析构B,输出~B,在B的析构函数中释放P,接着调用类A的析构函数,输出~A。
                程序2:
<pre name="code" class="cpp">#include <iostream>
using namespace std;
class MyClass
{
public:
    MyClass(int x=0):i(x){cout<<"C"<<i<<endl;}//MyClass的构造函数
    ~MyClass(){cout<<"D"<<i<<endl;;}//MyClass的析构函数
    void SetValue(int val){i=val;}//设置MyClass类的成员函数i的值i
    int GetVal(){return i;}//得到i
private:
    int i;
};
int main()
{
    MyClass *p[3];//定义一个指向MyClass类的指针数组
    int i;
    for (i=0; i<3; i++)
    {
        p[i]=new MyClass(i);//分配一块内存并把内存首地址赋给指针数组p[i];
                            //此过程相当于创建一个MyClass类的对象,并调用
                            //构造函数,把当前i的值0传给形参x,然后用x去初始化
                            //p[0]所指对象的数据成员i,然后输出"C0"
        p[i]->SetValue(p[i]->GetVal()*2);
        //对象p[i]调用成员函数给数据成员i赋值,参数为“p[i]->GetVal()*2”,即当前i的值的2倍。
        //经过此过程对象p[0]的数据成员i已经为0*0=0;
        //然后继续循环,i变为1,重复上面过程  输出C1后 i变为2,以此类推
    }
    for (i=0; i<3; i++)
        delete p[i];
        //i的初值为0,故释放p[0],调用析构函数,输出D0,继续循环输出D2  D4
    cout<<endl;
    return 0;
}
运行结果:
 
<img src="https://img-blog.csdn.net/20160429181424326?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
     程序3:
<pre name="code" class="cpp">#include <iostream>
using namespace std;
class AA
{
public:
    AA(int i,int j)
    {
        A=i;
        B=j;
        cout<<"Constructor\n";
    }
    AA(AA &obj)
    {
        A=obj.A+1;
        B=obj.B+2;
        cout<<"Copy_Constructor\n";
    }
    ~AA() {
        cout<<"Destructor\n";
    }
    void print()
    {
        cout<<"A="<<A<<",B="<<B<<endl;
    }
private:
    int A,B;
};
int main()
{
    AA a1(2,3);//建立a1对象,调用构造函数输出Constructor
    AA a2(a1);//建立对象a2,调用复制构造函数把a1中的A加1,B加2,
                //同时输出Copy_Constructor
    a2.print();//输出a=3 b=5
    AA *pa=new AA(5,6);//创建一个AA类的内存,并把首地址赋给pa,然后调用构造函数
    pa->print();//输出a=5, b=6
    delete pa;//试放pa对象,调用析构函数,然后程序结束,自动掉用析构函数析构掉a2,a1,
                //故一共三次输出Destructor
    return 0;
}

运行结果:
 
<img src="https://img-blog.csdn.net/20160429182749130?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值