请解释一下,下面的程序!多谢!
请解释一下,下面的程序!谢谢!!
#include <iostream.h>
class A
{
public:
A( ) { a=0; cout < < "类A的缺省构造函数.\n "; }
A(int i) { a=i; cout < < "类A的构造函数.\n "; }
~A( ) { cout < < "类A的析构函数.\n "; }
void Print( ) const { cout < <a < < ", "; }
int Geta( ) { return a; }
private:
int a;
};
class B : public A
{
public:
B( ) { b=0; cout < < "类B的缺省构造函数.\n "; }
B(int i, int j, int k);
~B( ) { cout < < "类B的析构函数.\n "; }
void Print( );
private:
int b;
A aa;
};
B::B(int i, int j, int k):A(i), aa(j)
{
b=k;
cout < < "类B的构造函数.\n ";
}
void B::Print( )
{
A::Print( );
cout < <b < < ", " < <aa.Geta( ) < <endl;
}
void main( )
{
B bb[2];
bb[0] = B(1, 2, 5);
bb[1] = B(3, 4, 7);
for(int i=0; i <2; i++)
bb[i].Print( );
}
程序运行结果是:
类A的缺省构造函数
类A的缺省构造函数
类B的缺省构造函数
类A的缺省构造函数
类A的缺省构造函数
类B的缺省构造函数
类A的构造函数
类A的构造函数
类B的构造函数
类B的析构函数 -------这些以横线标识的6行,怎么会在这里出现?
类A的析构函数 -------难道构造函数运行完,就直接运行析构函数?
类A的析构函数 -------但下面还用到了这些对象,为什么?
类A的构造函数
类A的构造函数
类B的构造函数
类B的析构函数 -------
类A的析构函数 -------
类A的析构函数 -------
1,5,2
3,7,4
类B的析构函数
类A的析构函数
类A的析构函数
类B的析构函数
类A的析构函数
类A的析构函数
------解决方案--------------------
因为中间创建了一些临时变量。
------解决方案--------------------
B bb[2];
bb[0] = B(1, 2, 5);
bb[1] = B(3, 4, 7);
先用缺省构造函数构造了两个bb
然后再创建两个临时变量 B(1, 2, 5)和B(3, 4, 7)
使用有参构造函数
之后通过系统的给的默认赋值函数将这两个变量赋值给bb[0] bb[1]
#include <iostream.h>
class A
{
public:
A( ) { a=0; cout < < "类A的缺省构造函数.\n "; }
A(int i) { a=i; cout < < "类A的构造函数.\n "; }
~A( ) { cout < < "类A的析构函数.\n "; }
void Print( ) const { cout < <a < < ", "; }
int Geta( ) { return a; }
private:
int a;
};
class B : public A
{
public:
B( ) { b=0; cout < < "类B的缺省构造函数.\n "; }
B(int i, int j, int k);
~B( ) { cout < < "类B的析构函数.\n "; }
void Print( );
private:
int b;
A aa;
};
B::B(int i, int j, int k):A(i), aa(j)
{
b=k;
cout < < "类B的构造函数.\n ";
}
void B::Print( )
{
A::Print( );
cout < <b < < ", " < <aa.Geta( ) < <endl;
}
void main( )
{
B bb[2];
bb[0] = B(1, 2, 5);
bb[1] = B(3, 4, 7);
for(int i=0; i <2; i++)
bb[i].Print( );
}
程序运行结果是:
类A的缺省构造函数
类A的缺省构造函数
类B的缺省构造函数
类A的缺省构造函数
类A的缺省构造函数
类B的缺省构造函数
类A的构造函数
类A的构造函数
类B的构造函数
类B的析构函数 -------这些以横线标识的6行,怎么会在这里出现?
类A的析构函数 -------难道构造函数运行完,就直接运行析构函数?
类A的析构函数 -------但下面还用到了这些对象,为什么?
类A的构造函数
类A的构造函数
类B的构造函数
类B的析构函数 -------
类A的析构函数 -------
类A的析构函数 -------
1,5,2
3,7,4
类B的析构函数
类A的析构函数
类A的析构函数
类B的析构函数
类A的析构函数
类A的析构函数
------解决方案--------------------
因为中间创建了一些临时变量。
------解决方案--------------------
B bb[2];
bb[0] = B(1, 2, 5);
bb[1] = B(3, 4, 7);
先用缺省构造函数构造了两个bb
然后再创建两个临时变量 B(1, 2, 5)和B(3, 4, 7)
使用有参构造函数
之后通过系统的给的默认赋值函数将这两个变量赋值给bb[0] bb[1]