序:都说书写是为了更好地思考,最近在学习c++编程设计,之前在博客园上看到的各位大神们的随笔,心中充满各种羡慕嫉妒,怎么都写得这么好。为此在摸索良久后,终于在今天开启了自己的随笔之路。
正文:c++类的组合,描述的是一个类内嵌入其他类的对象作为成员的情况,它们之间的关系式包含与被包含的关系。当创建类的时候,如果这个类具有内嵌对象成员,那么各个内嵌对象也将被自动创建。 在声明一个组合类的对象时,不仅它自身的构造函数将被调用,而且还将调用其内嵌对象的构造函数。构造函数的调用顺序为:
①按照内嵌对象在组合类的声明出现的次序,依次调用其内嵌对象的构造函数。
②执行本类构造函数的函数体。
实例:求两点间的距离(开发环境:VS2010 控制台应用程序)
1 #include "stdafx.h" 2 #include<iostream> 3 #include<math.h> 4 using namespace std; 5 class Point //定义Point类 6 { 7 public: 8 Point(float x,float y);//构造函数 9 Point(Point& point);//拷贝构造函数 10 float GetX(){return X;} 11 float GetY(){return Y;} 12 private: 13 float X,Y; 14 15 }; 16 Point::Point(float x,float y):X(x),Y(y) 17 { 18 cout<<"Point类构造函数被调用"<<endl; 19 } 20 21 Point::Point(Point& point) 22 { 23 X=point.X; 24 Y=point.Y; 25 cout<<"Point类拷贝构造函数被调用:"<<endl; 26 } 27 28 class Distance 29 { 30 public: 31 Distance(Point p1,Point p2);//构造函数 32 double Get_Dis(){return dist;} 33 private: 34 Point P1,P2; 35 double dist; 36 37 }; 38 Distance::Distance(Point p1,Point p2):P1(p1),P2(p2) 39 { 40 cout<<"Distance类构造函数被调用"<<endl; 41 double x=double(P1.GetX()-P2.GetX()); 42 double y=double(P1.GetY()-P2.GetY()); 43 dist=sqrt(x*x+y*y); 44 } 45 46 int _tmain(int argc, _TCHAR* argv[]) 47 { 48 float x1,y1,x2,y2; 49 cout<<"请输入第一个点坐标值(x,y):"<<endl; 50 cin>>x1>>y1; 51 cout<<"请输入第二个点坐标值(x,y):"<<endl; 52 cin>>x2>>y2; 53 Point p1(x1,y1),p2(x2,y2); 54 Distance dis(p1,p2); 55 cout<<"此两点距离为:"<<dis.Get_Dis()<<endl; 56 system("pause"); 57 return 0; 58 }
程序运行结果为:
分析:主程序在执行时,首先生成两个Point类对象,然后构造Distance类对象,在执行第54行代码时(即声明Distance类对象),Point类的拷贝构造函数被调用了4次,它们分别是两个Point对象在Distance类对象构造函数进行函数参数形参与实参结合时和初始化内嵌对象时调用的。
时间: 2024-10-08 21:08:41