/* 
*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;
}

运行结果:

第九周练习 阅读程序_C++

运行过程描述:

            在程序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;
}

运行结果:

程序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;
}


运行结果: