frontcon函数用不了_C++拷贝构造函数与类的组合

1 再谈拷贝构造函数

公众号得到了大飞哥的支持,大佬还给出了课后思考题:为什么拷贝构造函数参数必须使用引用?

一开始我也没深究为什么,只是觉得语法规定这样就这样写。我们来看看不使用引用会怎样 ?

e31a1a7e89dd661c962c0c5bf9b70f4f.png

程序报错:Error1error C2652: 'Clock' : illegal copy constructor: first parameter must not be a 'Clock'

这里参数Clock T 对应前一篇文章三种情况中的情况二——对象以值传递的方式传入函数参数,会调用拷贝构造函数,形成无限递归,所以必须传引用。

想用机器人赋能未来,少不了扎实的编程基本功,继续跟着清华大学的C++ 程序设计学习吧~

在制造业中使用部件组装的方式生产效率更高,程序中也可以借用该思想。C++程序支持类的组合。

2 类的组合

类中的数据成员是另一个类的对象。可以在已有抽象类的基础上实现更复杂的抽象。

类组合的构造函数的设计

原则:不仅要负责对本类中的基本类型成员数据初始化,也要对对象成员初始化。

声明形式:

类名::类名(对象成员所需的形参,本类成员形参):     对象1(参数),对象2(参数),...{//函数体其他语句}

构造组合类对象时的初始化次序

  • 首先对构造函数初始化列表中列出的成员(包括基本类型成员和对象成员)进行初始化,初始化次序是成员在类体中定义的次序。

  • 成员对象构造函数调用的顺序:按对象成员的定义顺序,先声明者先构造。

  • 初始化列表中未出现的成员对象,调用默认构造函数(即无参的)初始化

  • 处理完初始化列表之后,再执行构造函数的函数体。

组合类的例子

#includeusing namespace std;//Pointclass Point{private:  double x,y;public:  Point(double x,double y):x(x),y(y)  {  }  Point(const Point &p)//Copy constructor   {    x=p.x;    y=p.y;    //cout<  }  double getX()  {    return x;  }  double getY()  {    return y;  }};//Lineclass Line{public:  Line(Point a,Point b):a(a),b(b)  {    double x=a.getX()-b.getX();    double y=a.getY()-b.getY();    length=sqrt(x*x+y*y);  }  Line(const Line & L):a(L.a),b(L.b){    length = L.length;  }//组合类的拷贝构造 private:  double length;  Point a,b;};int main(){  Point a(1,2),b(3,4);//建立Point类的对象  Line ab(a,b);//建立Line类的对象  Line cd(ab);//用ab初始化cd  system("Pause");  return 0;}

我们知道线段是由点组成的,因此当定义一个线段类需要包含点类的成员。

我们来单步调试下看看在建立组合类对象 Line ab(a,b); 时发生了什么。

首先进入到拷贝构造函数

0c9d98d93d70700ca759c89431cbeaf4.png

先传的后一个参数b

4f166aa34104e767e0267a97fa6d888b.png

再调用拷贝构造函数再传的前一个参数a

ad573ca2592700545e0508a956d3bcbc.png

然后进入Line的构造函数

e6c917aea97a06dae22c4e81dff4f5a3.png

如何写组合类的拷贝构造函数呢,先按照以前的方式写下看看

Line(const Line & L){length = L.length; a = L.a; b = L.b; }

程序报错:

112a83da44ec6328fa1ff9bbfea7263a.png

Point没有合适的默认构造函数,没有默认构造函数的内嵌对象Point初始化必须在构造函数的初始化列表中。

Line(const Line & L):a(L.a),b(L.b){    length = L.length;  }

至此完成了组合类的拷贝构造。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值