c++ - 意外调用了复制构造函数
问题描述
我是 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 << "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;
}
根据上面的代码,我最后使用了复制构造函数,但是在每个对象的形成时都会调用复制构造函数。即使两者的参数不同。为什么会这样?我正在从这里学习。
感谢我的代码中的每一个建议。
谢谢!
解决方案
您将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&);
注意:像您的代码一样,我们可以在复制构造函数中添加其他参数,同时它们具有默认值)。
注意:有关更多信息:阅读 Bjarne Stroustrup 的“C++ 编程语言”的第 17 章。
这与您的问题无关,是我对您的代码的建议,如果您不喜欢它,您可以跳过(或编辑并删除它)
一些代码审查建议:
- 停止使用
using namespace std;
可能导致未定义行为并给你一个艰难的调试时间:为什么“使用命名空间标准;” 被认为是不好的做法? - 如果没有必要,不要使复制构造函数签名复杂化。您可以按如下方式重写复制构造函数:
Complex::Complex(Complex const& obj)
: a(obj.a)
, b(obj.b)
, name(obj.name)
{
cout << "Copy Cons called!" << endl;
PrintComp();
}
- 使用成员初始化列表初始化成员变量。
推荐阅读
- html - Windows 和 Linux 版本 2.1.1 的不同 PDF 输出
- business-intelligence - 按天数列出的过期库存列表框
- php - 在 apache env vars 中包含的 Ubuntu OS 变量不起作用
- code-coverage - 如何使用 PMD 发现重复的代码行
- c# - 在 NavigationPage 中显示视图的 Xamarin 表单
- java - FusedLocationProviderClient requestLocationUpdates:如果位置可用,如何进行轮询
- javascript - 隐藏聚合的自定义复合控件绑定问题
- ruby - 覆盖父母的单例方法
- php - 如何从 laravel 刀片页面的存储文件夹中下载文件?
- ruby-on-rails - 在同一应用程序中进行 POST 时的真实性令牌无效