复制构造函数被意外调用



我是c++编程新手。我使用Visual Studio Code,我的代码:

#include <iostream>
using namespace std;
class Calculator;
class Complex
{
float a, b;
string Operation;
string name;
friend class Calculator;
public:
Complex(float, float, string, string);
Complex(float);
Complex();
Complex(Complex &, string);
void PrintComp(string op = "None")
{
if (op != "None" && name != "None")
{
cout << "nBy " << op << " of z1 and z2:n"
<< name << " = " << a << " + " << b << "in";
}
else if (name != "None")
{
cout << name << " = " << a << " + " << b << "in";
}
else
{
cout << a << " + " << b << "in";
}
}
};
Complex ::Complex(float x, float y, string givnname = "None", string operation = "None")
{
a = x;
b = y;
name = givnname;
PrintComp(operation);
}
Complex ::Complex(float x)
{
a = x;
b = 0;
}
Complex ::Complex()
{
a = 0;
b = 0;
}
Complex::Complex(Complex &obj, string givnname="None")
{
a = obj.a;
b = obj.b;
name = givnname;
cout << "Copy Cons called!"<< endl;
PrintComp();
}
class Calculator
{
public:
float SumRealComp(Complex const&, Complex const&);
float SumImgComp(Complex const&, Complex const&);
};
float Calculator ::SumRealComp(Complex const &obj1, Complex const & obj2)
{
return (obj1.a + obj2.a);
}
float Calculator ::SumImgComp(Complex const & obj1, Complex const & obj2)
{
return (obj1.b + obj2.b);
}
int main()
{
Complex z1(3, 5, "z1"), z2(4, 4, "z2");
Calculator calc;
Complex z3(calc.SumRealComp(z1, z2), calc.SumImgComp(z1, z2), "z3", "Sum");
Complex z4(z1, "z4");
return 0;
}

根据上面的代码,我在最后使用复制构造函数,但是在构造每个对象时调用复制构造函数。即使两者的参数不同。为什么会这样呢?我正在从这里学习。
在我的代码中的每一个建议都是赞赏的。
谢谢!

您将在这些函数上获取Complex对象的副本:

Calculator::SumRealComp(Complex, Complex);
Calculator::SumImgComp(Complex, Complex);

因此,每次调用这些函数时,都要获取Complex对象的两个副本。你可以传递一个Complex const&对象来避免复制:

Calculator::SumRealComp(Complex const&, Complex const&);
Calculator::SumImgComp(Complex const&, Complex const&);

复制构造函数复制构造函数是类特殊成员函数之一,当我们试图获取对象的副本时调用它:

class X;
void f(X); 
X x;
f(x); // <--- Here
X another(x); // <--- Here
X yet_another = x; // <--- And here

在注释部分,我们可以调用X复制构造函数。复制构造函数可以定义为以下签名:

X::X(X&);
X::X(X const&);
X::X(X volatile&);
X::X(X const volatile&);

注意与您的代码一样,我们可以在复制构造函数具有默认值时向其添加额外的参数)。
注意更多信息请阅读《c++编程语言》第17章。作者:Bjarne Stroustrup


这与你的问题无关,是我对你的代码的建议,如果你不喜欢它,你可以跳过(或编辑它并删除它)

一些代码复查建议:

  1. 停止使用using namespace std;,这可能会导致未定义行为,并给您带来艰难的调试时间:为什么使用命名空间std;被认为是不好的做法?
  2. 如果没有必要,不要使Copy Constructor签名复杂化。你可以这样重写复制构造函数:
Complex::Complex(Complex const& obj)
: a(obj.a)
, b(obj.b)
, name(obj.name)
{
cout << "Copy Cons called!" << endl;
PrintComp();
}
  1. 使用member Initialize List初始化成员变量

最新更新