您的位置:首页 > 其它

第十二周 阅读项目 (5)

2015-06-01 20:49 274 查看
阅读下面类的定义,请说出在测试函数中不同情况的调用产生的结果

[cpp] view
plaincopyprint?





#include <iostream>

using namespace std;

class A

{

protected:

int a,b;

public:

A(int aa, int bb):a(aa), b(bb) {}

void printA()

{

cout<<"a: "<<a<<"\tb: "<<b<<endl;

}

};

class B: public A

{

int c;

public:

B(int aa, int bb, int cc):A(aa,bb),c(cc) {}

void printB()

{

cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl;

}

};

int main()

{

A a(1,1);

B b(2,3,4);

//此处加入下面各小题中的代码

return 0;

}

(a)

[cpp] view
plaincopyprint?





a=b;

a.printA();

b.printA();

b.printB();

你认为输出结果是:__________ ____________

运行程序的结果是:______________________



(b)

[cpp] view
plaincopyprint?





b=a;

a.printA();

b.printA();

b.printB();

程序会发生编译错误,原因是:__________

记录下IDE中提示的错误并理解:_________

只能用子类对象对基类对象赋值,而不用基类对象对其子类对象赋值。

同一基类的不同派生类对象之间也不能赋值。

(c)

[cpp] view
plaincopyprint?





A &r1=a;

A &r2=b;

r1.printA();

r2.printA();

r2.printB();

将会发生错误的一行删除;

对余下的程序,你认为输出是:__________

实际运行的输出是:____________________

那一行的错误原因是:__________________



删除后运行结果:



(d)

[cpp] view
plaincopyprint?





A *p=&a;

p->printA();

p=&b;

p->printA();

p->printB();

将会发生错误的一行删除;

对余下的程序,你认为输出是:__________

实际运行的输出是:____________________

那一行的错误原因是:__________________

(e)

在class A中增加成员函数:

[cpp] view
plaincopyprint?





int getA(){return a;}

在main函数前增加一般函数:

[cpp] view
plaincopyprint?





void f(A x)

{

cout<<"aaaaah, my a: "<<x.getA()<<endl;

}

main函数中指定部分为:

[cpp] view
plaincopyprint?





f(a);

f(b);

你认为输出结果是:______________________

运行程序的结果是:______________________



补充阅读

[cpp] view
plaincopyprint?





#include <iostream>

using namespace std;

class B

{

public:

B(int x=0)

{

X=x;

cout<<"B("<<x<<")\n";

}

~B()

{

cout<<"~B()\n";

}

void print()

{

cout <<X<< " ";

}

private:

int X;

};





class D: public B

{

public:

D (int x, int y):B(x)

{

Y=y;

cout<<"D("<<x<<","<<y<<")\n";

}

~D()

{

cout<<"~D()\n";

}

void print() //与基类中的成员函数同名!这个冲突如何解决的?!

{

B::print();

cout <<Y<<endl;

}

private:

int Y;

};

int main()

{

D d(11,22);

d.print();

return 0;

}

运行结果:



总体来说,结合了组合和继承的c++类中,构造函数和析构函数的调用顺序具有以下规律:

1、对于继承:如果有基类,首先构造指定类的基类;

2、对于组合:按照嵌入的成员对象的声明顺序构造它们,成员对象构造完成后再构造封装它们的这个类;

3、构造和析构本身依赖于压栈和出栈,因此析构函数的函数的调用应该遵循栈的特性,以“后进先出”为原则——析构函数的调用与构造函数完全相反,先构造的后析构,后构造的先析构;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: