书P137:
如果声明组合类的对象时没有指定对象的初始值,自动调用无形参的构造函数,
构造内嵌对象时也对应调用内嵌对象的无形参的构造函数。
Q1:这里,对于“构造内嵌对象时也对应调用内嵌对象的无形参的构造函数”;他指的是什么时候(什么条件下)?
是唯独没有指定(内嵌)对象的初始值的时候,还是只是指所有对象全都没有初始值时(这么操作)?
在这里,反复阅读题干,我们应该可以发现(说):
题干中既然说了是“指定对象”,那么也就是说看具体对象内容而定:
当非内嵌对象没有初值时,自动调用无形参的构造函数
当内嵌对象没有初值时,调用内嵌对象的无形参的构造函数
当所有对象全都没有初始值时:
非内嵌对象自动调用无形参的构造函数
内嵌对象自动调用内嵌对象的无形参的构造函数
析构函数的执行顺序与构造函数正好相反。
Q2:他这里的顺序相反,指的是析构函数在消除清理内容和空间时,是先处理非内嵌对象再处理内嵌对象吗?
设计程序验证Q1,Q2:
例8-13 用组合类计算两点间的距离。
源程序:
#include
using namespace std;
class Point
{
public:Point(int xx, int yy){X = xx; Y = yy;}//构造函数Point(Point& p);int GetX(void){return X;}//取X坐标int GetY(void){return Y;}//取Y坐标
private:int X, Y;//点的坐标
};
Point::Point(Point& p)
{X = p.X;Y = p.Y;cout << "Point拷贝构造函数被调用" << endl;
}
//
class Distance
{
public:Distance(Point a, Point b);//构造函数double GetDis() { return dist; }
private:Point p1, p2;double dist; //距离
};
Distance::Distance(Point a, Point b) :p1(a), p2(b)
//组合类的构造函数
{cout << "Distance 构造函数被调用" << endl;double x = double(p1.GetX() - p2.GetX());double y = double(p1.GetY() - p2.GetY());dist = sqrt(x * x + y * y);
}
void main()
{Point myp1(1, 1), myp2(4, 5);Distance myd(myp1, myp2);cout << "The distance is:" << myd.GetDis() << endl;
}
运行结果:

为什么(明明)有了“sqrt()函数”却不用在函数开头的头文件里面输入#include
详见:C语言日记 8 C++语句_宇 -Yu的博客-CSDN博客:#include <math.h>//可有可无
书P139:
不完全类型不能定义该类型的对象:
#include
using namespace std;
class B;
class A
{int i;B b;
};
class B
{int i;A a;
};
int main()
{}
只能用于:
(1):定义(指向该类型的)
#include
using namespace std;
class B;
class A
{int i;B *b;
};
class B
{int i;A a;
};
int main()
{}
#include
using namespace std;
class B;
class A
{int i;B& b;
};
class B
{int i;A a;
};int main()
{}
但是在这里,我们还是需要注意:不完全类型不能在别的类里(面)定义该类型的对象:
#include
using namespace std;
class B;
class A
{int i;B u;B& b=u;
};
class B
{int i;A a;
};int main()
{}

从这个里面(这个角度)说起来这个引用的作用意义又很奇怪:
引用只能在声明引用时赋初值(初始化)
而在类的引用里面如果我们要(想)初始化,只能将该类里面的不完全类型对象赋给该引用对象
可是不完全类型又不能在别的类里(面)定义该类型的对象,这里面这不就是一个悖论吗
(2):声明<不是定义>(使用该类型作为)
#include
using namespace std;
class B;
class A
{int i;int f(B b);
};
int main()
{}
而不能:
#include
using namespace std;
class B;
class A
{int i;int f(B b){}
};
int main()
{}

对于这个其实我就有点不知从何写起了:
#include
using namespace std;
class B;
class A
{int i;B f(){return b;}};
int main()
{}
