zoukankan      html  css  js  c++  java
  • c++类组合

    类的组合是指:类中的成员数据是另一个类的对象。
    通过类的组合可以在已有的抽象的基础上实现更复杂的抽象。
    例如:在定义了点类(Point)以后,我们希望通过两个点定义一点线段,甚至还希望通过三个点定义一个三角形,或四边形等等。
    类组合中的难点是关于它的构造函数设计问题。组合类中有其他类的对象作为成员,这些对象成员也成为类的内嵌对象成员。
    组合类在创建对象时,它的各个内嵌对象将首先被自动创建。因此,在创建对象时既要对本类的基本数据类型数据成员进行初始化,又要对内嵌对象成员进行初始化。
    组合类构造函数定义的一般形式为:
    类名::类名(总形参表):内嵌对象1(形参表),内嵌对象2(形参表),… { 类的初始化 }
    示例

     1 #include <iostream>
     2 #include <cmath>
     3 
     4 using namespace std;
     5 
     6 class Point{
     7 private:
     8 int x,y;
     9 public:
    10 Point(int px,int py)
    11 {
    12 x=px;
    13 y=py;
    14 cout<<"Point constructor called"<<endl; //调用的点构造函数 
    15 }
    16 Point(const Point& p)
    17 {
    18 x=p.x;
    19 y=p.y;
    20 cout<<"Point copy constructor called"<<endl; //调用的点复制构造函数 
    21 }
    22 ~Point()    {    cout<<"Point destructor called"<<endl;    }    
    23 int getx()    {    return x;    }
    24 int gety()    {    return y;    }
    25 };
    26 
    27 class Line{
    28 private:
    29 //这里体现了类的组合:即Line类中的数据成员是另一个Point类的对象。
    30 //通过类的组合在已有的点抽象的基础上实现了更复杂的线段抽象。 
    31 Point p1,p2; //定义了点对象p1,p2为它的私有数据成员,得以访问点对象中的成员 
    32 double len;
    33 public:
    34 //线段需要两个点构成,传入点对象xp1,xp2。并将它们保存到线段类的数据成员中 
    35 Line(const Point& xp1,const Point& xp2); //线段复制构造函数 
    36 ~Line()    {    cout<<"Line destructor called"<<endl;    }
    37 double getLen()    {return len;}
    38 };
    39 
    40 Line::Line(const Point& xp1,const Point& xp2):p1(xp1),p2(xp2)
    41 {
    42 double x=p1.getx()-p2.getx();
    43 double y=p1.gety()-p2.gety();
    44 len=sqrt(x*x+y*y);
    45 cout<<"Line constructor called"<<endl; //调用的线段复制构造函数 
    46 }
    47 
    48 int main()
    49 {
    50 Point pa(3,4),pb(10,9);
    51 Line L1(pa,pb);
    52 cout<<"L1 start point:"<<"("<<pa.getx()<<","<<pa.gety()<<")"<<endl;
    53 cout<<"L1 end point:"<<"("<<pb.getx()<<","<<pb.gety()<<")"<<endl;
    54 cout<<"The length of L1 is:"<<L1.getLen()<<endl;
    55 return 0;
    56 }

    1.在程序运行后,先调用Point类的构造函数两次,构造Point类对象pa和pb;
    2.然后构造Line类对象L1,在执行L1类的构造函数之前,先调用内嵌对象的构造函数,由于内嵌对象是用已有的Point对象进行初始化的,所以调用了两次复制构造函数来完成内嵌对象的初始化;
    3.接下来执行组合类Line的构造函数,最后输出相关信息。

    4.程序运行到最后就开始析构对象。先析构Line对象,在析构组合类对象时,析构函数的执行顺序正好与构造函数相反。所以先执行Line类的析构函数,然后执行内嵌对象的析构函数,最后析构函数中的两个Point类对象pa和pb。

    ————————————————
    版权声明:本文为CSDN博主「Pink_floyd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_42932834/article/details/89449042

  • 相关阅读:
    Centos7创建用户su登录后显示为 bash-4.1$
    winserver 搭建 Citrix License 许可服务器
    Centos7扩展存储空间
    CentOS7配置crate集群
    CentOS7安装cratedb
    初探Vue
    浅谈web攻防
    响应式布局
    JavaScript正则表达式,你真的知道?
    15个关于Chrome的开发必备小技巧[译]
  • 原文地址:https://www.cnblogs.com/zhaoyiyao/p/12883385.html
Copyright © 2011-2022 走看看