我正在调试一些用C ++编写的模拟软件,并且无法理解部分代码。
软件模拟在3D世界中移动的一些实体,并且可以设置它们的行为,使得它们从A到B的直线移动,围绕特定点螺旋移动,或遵循预定义的路线等。
当一个实体在模拟中移动时,会向用户呈现一些有关其移动的信息,例如:当前速度,航向(方向),到当前目标的距离,达到其当前所需的时间目标& ETA在那个地方等等。
我目前正在处理的错误是,ETA和“完成当前行程的时间”向用户显示的值不正确。
我在C ++源文件中遇到以下代码,该文件向用户显示此信息:
DateTimeAndZone fpETA(mCurrentTime);
SystemTimeTypes::addRelativeTimeToSystemTime(fpETA, flightPlanETA);
DateTimeAndZone
是一个类,因此fpETA
是该类的一个实例...我不明白的是mCurrentTime
(也是DateTimeAndZone
),可以作为类实例的参数传递 - 看起来与参数传递给函数的方式相同。
如果我进入DateTimeAndZone
类的定义,则在其末尾有一个return
语句,返回static std::string_classname
。
有人可以向我解释一下如何将类传递为创建新类的参数吗?这有什么影响?这是否意味着新类将采用存储在现有类中的信息?或者我在这里缺少什么?
我在SO上遇到过这个问题,但它并没有真正回答我的问题... Passing a class object as an argument in C++
答案 0 :(得分:1)
DateTimeAndZone fpETA(mCurrentTime);
这将调用DateTimeAndZone的构造函数,并定义参数。如果mCurrentTime是DateTimeAndZone对象,则默认情况下将调用复制构造函数,如果已定义,则调用DateTimeAndZone的复制构造函数。
答案 1 :(得分:0)
这称为复制构造函数。它通过从DateTimeAndZone
对象复制数据来创建新的mCurrentTime
对象。这种功能的签名通常是:
DateTimeAndZone (const &DateTimeAndZone);
如果查看具有该签名的方法的类定义,您应该看到这个特定的拷贝构造函数的作用。
答案 2 :(得分:0)
类可以像任何其他类型一样作为参数传递,您真的需要查看该构造函数的实现(如果没有文档)以查看它使用参数的内容。
通常使用这种类型的构造函数称为复制构造函数,有很多问题可以解释复制构造函数的使用以及随之而来的含义:
When do we have to use copy constructors?
The copy constructor and assignment operator
What is a copy constructor in C++?
What is the difference between a deep copy and a shallow copy?
答案 3 :(得分:0)
以下内容:
class DateTimeAndZone;
DateTimeAndZone fpETA(mCurrentTime);
// ^ this invokes:
DateTimeAndZone::DateTimeAndZone(const DateTimeAndZone &arg);
最后一行是DateTimeAndZone
类的复制构造函数。此复制构造函数将创建一个新的DateTimeAndZone
对象,该对象将保存您传递的参数的副本(在这种情况下为mCurrentTime
)。
复制构造函数可以由编译器自动生成(您可以研究this slideshare以查看它是在哪种情况下)或用户定义的。