希望我的主题找到你。
我尝试了一些东西,我需要一个解释
我为复数编写了一个类,在构造函数实现中打印“constructor”一词,在析构函数实现中打印“析构函数”一词。
我已经声明了3个对象,通过值将它们发送到非类成员函数,该函数将类中的两个对象作为参数,并返回一个类对象作为两个复数的总和
我发现,析构函数调用的数量不等于构造函数调用的数量,实际上它们更多。
我有2个构造函数调用和4个析构函数调用。
有人对此事有任何解释吗?
非常感谢您的合作和帮助。
答案 0 :(得分:0)
有许多构造函数,其中一些可能是为您创建的:
默认构造函数MyClass()
尽可能少地设置MyClass对象。
复制构造函数MyClass(const MyClass & source)
将source
复制到MyClass的全新对象
移动构造函数MyClass(MyClass && source)
将源的内容移动到MyClass的全新对象中,并使source
为空,但处于安全状态。
很多时候你会发现复制构造函数在后台安静地使用而你没有声明或要求它。例如,
myVector.push_back(myObject);
通常会将myObject复制到myVector中。
void MyFunction(MyClass myObject)
按值接受myObject,可以在进程中复制源对象。要看到这一点:
void MyFunction(MyClass myObject) // copy constructs myObject from the caller's parameter
{
myVector.push_back(myObject); // copy constructs a myClass into myVector from myObject
} // destructs myObject
在此调用中,创建了两个新对象,一个被销毁。如果你没有定义一个带有打印行的复制构造函数,所以显示它发生了,你只会看到析构函数的神秘调用。当向量被销毁,清除或从中移除myObject时,将会有另一个析构函数调用。
MyClass MyOtherFunction()
如果必须,将复制返回的MyClass,但通常会找到解决方法。
这不是解决方案,但可能是解决方案的路径:在其中添加带有print语句的复制构造函数。
MyClass(const MyClass & source)
{
// copy all member variables from source to this
std::cout << "Copy constructor called" << std::endl;
}
我建议您阅读Rule of Three,了解这一点的重要性。提示:这与过度实现的西斯没有任何关系。