复制构造函数意外调用
Copy Constructor called unexpectedly
我是 C++ 编程新手。我正在使用 Visual Studio 代码,我的代码:
#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 << "i\n";
}
else if (name != "None")
{
cout << name << " = " << a << " + " << b << "i\n";
}
else
{
cout << a << " + " << b << "i\n";
}
}
};
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;
}
根据上面的代码,我最后使用的是复制构造函数,但是
复制构造函数在每个对象的形成时被调用。即使两者的参数不同。为什么会这样?
我正在向 here 学习。
感谢我的代码中的每一个建议。
谢谢!
您将在这些函数上获取 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 Special Member Functions之一,每当我们尝试获取对象的副本时调用:
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&);
注意:像您的代码一样,我们可以在复制构造函数具有默认值的情况下向它们添加其他参数。
注意:有关详细信息:请阅读 Bjarne Stroustrup 的“The C++ Programming Language”的第 17 章。
这与你的问题无关,是我对你的代码的建议,如果你不喜欢它,你可以跳过(或编辑它并删除它)
一些代码审查建议:
- 停止使用
using namespace std;
,这可能会导致未定义的行为并给您带来困难的调试时间:Why is "using namespace std;" considered bad practice?
- 如无必要,不要使复制构造函数签名复杂化。您可以按如下方式重写复制构造函数:
Complex::Complex(Complex const& obj)
: a(obj.a)
, b(obj.b)
, name(obj.name)
{
cout << "Copy Cons called!" << endl;
PrintComp();
}
- 使用成员初始化列表初始化成员变量。
我是 C++ 编程新手。我正在使用 Visual Studio 代码,我的代码:
#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 << "i\n";
}
else if (name != "None")
{
cout << name << " = " << a << " + " << b << "i\n";
}
else
{
cout << a << " + " << b << "i\n";
}
}
};
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;
}
根据上面的代码,我最后使用的是复制构造函数,但是
复制构造函数在每个对象的形成时被调用。即使两者的参数不同。为什么会这样?
我正在向 here 学习。
感谢我的代码中的每一个建议。
谢谢!
您将在这些函数上获取 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 Special Member Functions之一,每当我们尝试获取对象的副本时调用:
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&);
注意:像您的代码一样,我们可以在复制构造函数具有默认值的情况下向它们添加其他参数。
注意:有关详细信息:请阅读 Bjarne Stroustrup 的“The C++ Programming Language”的第 17 章。
这与你的问题无关,是我对你的代码的建议,如果你不喜欢它,你可以跳过(或编辑它并删除它)
一些代码审查建议:
- 停止使用
using namespace std;
,这可能会导致未定义的行为并给您带来困难的调试时间:Why is "using namespace std;" considered bad practice? - 如无必要,不要使复制构造函数签名复杂化。您可以按如下方式重写复制构造函数:
Complex::Complex(Complex const& obj)
: a(obj.a)
, b(obj.b)
, name(obj.name)
{
cout << "Copy Cons called!" << endl;
PrintComp();
}
- 使用成员初始化列表初始化成员变量。