两道C++类的构造函数题,高分哦
三、阅读以下程序并给出执行结果(10分)
2.(3分)
#include <iostream>
using namespace std;
class Tc
{
int v1,v2;
public:
Tc(int x=0,int y=0):v1(x),v2(y)
{cout <<"This is a constructor!v1+v2="<<v1+v2<<endl;}
~Tc() {cout<<"This is a destructor!"<<endl;}
};
void main()
{
Tc x,y(10,20),z(y);
}
输出:?
3.(4分)
#include <iostream>
using namespace std;
class Bclass
{public:
Bclass(int i, int j)
{x=i;y=j;}
virtual int fun(){return 0;}
protected:
int x,y;
};
class Iclass:public Bclass
{public:
Iclass(int i,int j,int k):Bclass(i,j)
{z=k;}
int fun(){return(x+y+z)/3;}
private:
int z;
};
void main()
{ Iclass obj(2,4,10);
Bclass p1=obj;
cout<<p1.fun()<<endl;
Bclass & p2=obj;
cout<<p2.fun()<<endl;
cout <<p2.Bclass::fun()<<endl;
Bclass *p3=&obj;
cout<<p3->fun()<<endl;
}
输出:?
[解决办法]
试一下不就知道了吗.
2.
This is a constructor!v1+v2=0
This is a constructor!v1+v2=30
This is a destructor!
This is a destructor!
This is a destructor!
3.
0
5
0
5
[解决办法]
顶1楼
解释(有不当之处请大神纠正)
2.如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,即浅拷贝。浅拷贝不走其他构造函数。所以只输出了x和y的两个constructor,而没有输出c的
3.
Bclass p1=obj;
obj隐式类型转换为Bclass类型,所以调用的是Bclass的fun()
Bclass & p2=obj;
p2是obj的引用,但并没有发生类型转换,所以调用的是Iclass的fun()
p2.Bclass::fun()很好理解,调用Bclass的fun()
Bclass *p3=&obj;
p3是Bclass类型的指针,指向obj的地址,没有类型转换,所以调用的还是Iclass的fun()