很简单的拷贝构造函数次序小困惑

laraya 2009-02-27 06:05:21
书上的代码:
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
public:
Point(int xx=0, int yy=0) {X=xx;Y=yy;}
Point(Point &p);
int GetX() {return X;}
int GetY() {return Y;}
private:
int X,Y;
};
Point::Point(Point &p) //拷贝构造函数的实现
{
X=p.X;
Y=p.Y;
cout<<"Point拷贝构造函数被调用"<<X<<endl;//这里我刻意加的就是看它次序
}
//类的组合
class Line
{
public:
Line (Point xp1, Point xp2);
Line (Line &);
double GetLen(){return len;}
private:
Point p1,p2;
double len;
};
//组合类的构造函数
Line:: Line (Point xp1, Point xp2)
:p1(xp1),p2(xp2)
{
cout<<"Line构造函数被调用"<<endl;
double x=double(p1.GetX()-p2.GetX());
double y=double(p1.GetY()-p2.GetY());
len=sqrt(x*x+y*y);
}


void main()
{
Point myp1(3,9),myp2(6,8); //建立Point类的对象
Line line(myp1,myp2);
}
运行结果是:

Point拷贝构造函数被调用6
Point拷贝构造函数被调用3
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Line构造函数被调用
解释:
主函数中Line line(myp1,myp2);此时执行次序如下:
调用组合类Line的构造函数,myp1传给Line构造函数第一个xp1,一次调用point构造函数,结果应该是:
Point拷贝构造函数被调用6,
第二次myp2传给构造函数第一个xp2,结果应该好似Point拷贝构造函数被调用6,
然后根据组合类内嵌对象构造函数调用次序应该是先构造p1,后构造p2,
结果应该是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
显然后面2个是正确的,
但是初始的2个拷贝构造函数为什么次序不对呢?
难道实参和形参结合的时候是从右到左,而不是正常的从左到右吗?



...全文
189 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakqigle 2009-02-27
  • 打赏
  • 举报
回复
函数参数压栈的顺序是从右至左的。
laraya 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 activateMan 的回复:]
C++并没有规定函数参数传递时先传递哪个。
其给出的运行结果中前两个输出结果是因为以传值的方式传递参数,因此进行了两次copy操作
后两个是在初始化列表中,初始化p1,p2时进行的两次copy操作。
并且因为是先声明的p1,然后是p2,所以在初始化时,先对p1进行,后对p2进行
意思就是后面两个的输出结果一定是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
而前面两个则不一定
[/Quote]
我知道后面2个根据组合类里面定义的顺序来确定的
结果肯定是
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
就是前面的2个我觉得不对
这么说来前面参数传值次序是不确定的哈哈
activateMan 2009-02-27
  • 打赏
  • 举报
回复
C++并没有规定函数参数传递时先传递哪个。
其给出的运行结果中前两个输出结果是因为以传值的方式传递参数,因此进行了两次copy操作
后两个是在初始化列表中,初始化p1,p2时进行的两次copy操作。
并且因为是先声明的p1,然后是p2,所以在初始化时,先对p1进行,后对p2进行
意思就是后面两个的输出结果一定是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
而前面两个则不一定
laraya 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anglecloudy 的回复:]
但是初始的2个拷贝构造函数为什么次序不对呢?
难道实参和形参结合的时候是从右到左,而不是正常的从左到右吗?


正常的是从右到左
不正常才是从左到右。看一下调用方式:
http://hi.baidu.com/anglecloudy/blog/item/9a6a4001c3c24bd1277fb5ac.html
[/Quote]
看不懂哈哈
不过不是程序理解上的问题就好了
按这样说有函数有多个形参的时候,
实参是从右到左传递给形参的啊
记下了。
谢谢!!
逸萌 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anglecloudy 的回复:]
但是初始的2个拷贝构造函数为什么次序不对呢?
难道实参和形参结合的时候是从右到左,而不是正常的从左到右吗?


正常的是从右到左
不正常才是从左到右。看一下调用方式:
http://hi.baidu.com/anglecloudy/blog/item/9a6a4001c3c24bd1277fb5ac.html
[/Quote]
up
laraya 2009-02-27
  • 打赏
  • 举报
回复
帖子第一个6写错了,应该是3:
主函数中Line line(myp1,myp2);此时执行次序如下:
调用组合类Line的构造函数,myp1传给Line构造函数第一个xp1,一次调用point构造函数,结果应该是:
Point拷贝构造函数被调用3
laraya 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lzy340623339 的回复:]
构造函数初始化是按在类中的定义顺序初始化的,跟构造函数列表中数据出现的先后顺序无关。
所以结果应该是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Line构造函数被调用
我在我的电脑上运行就没有问题
[/Quote]
是真的吗?
我希望的就是你的这个结果,
但我的电脑运行上结果确实前面2个恰好是反的。
OenAuth.Net 2009-02-27
  • 打赏
  • 举报
回复
但是初始的2个拷贝构造函数为什么次序不对呢?
难道实参和形参结合的时候是从右到左,而不是正常的从左到右吗?


正常的是从右到左
不正常才是从左到右。看一下调用方式:
http://hi.baidu.com/anglecloudy/blog/item/9a6a4001c3c24bd1277fb5ac.html

lzy340623339 2009-02-27
  • 打赏
  • 举报
回复
构造函数初始化是按在类中的定义顺序初始化的,跟构造函数列表中数据出现的先后顺序无关。
所以结果应该是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Line构造函数被调用
我在我的电脑上运行就没有问题
lzy340623339 2009-02-27
  • 打赏
  • 举报
回复
构造函数初始化是按在类中的定义顺序初始化的,跟构造函数列表中数据出现的先后顺序无关。
所以结果应该是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Line构造函数被调用
我在我的电脑上运行就没有问题
lzy340623339 2009-02-27
  • 打赏
  • 举报
回复
构造函数初始化是按在类中的定义顺序初始化的,跟构造函数列表中数据出现的先后顺序无关。
所以结果应该是:
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Point拷贝构造函数被调用3
Point拷贝构造函数被调用6
Line构造函数被调用
我在我的电脑上运行就没有问题
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧