gpt4 book ai didi

C++ 默认构造函数

转载 作者:太空狗 更新时间:2023-10-29 19:47:01 24 4
gpt4 key购买 nike

我收到以下代码的编译错误:

main.cpp: In function âint main()â:
main.cpp:38: error: no matching function for call to âComplex::Complex(Complex)â
main.cpp:22: note: candidates are: Complex::Complex(Complex&)
main.cpp:15: note: Complex::Complex(double, double)

但是当我将复制构造函数的参数类型更改为 const Complex& 时,它起作用了。我在想默认构造函数将使用 2 Complex::Complex(2.0, 0.0) 调用,然后将调用复制构造函数来创建一个具有 Complex(2.0.0) 拷贝的构造函数。这不对吗?

#include <iostream>
using namespace std;

class Complex {
double re;
double im;

public:
Complex(double re=0, double im=0);
Complex(Complex& c);
~Complex() {};
void print();
};

Complex::Complex(double re, double im)
{
cout << "Constructor called with " << re << " " << im << endl;
this->re = re;
this->im = im;
}

Complex::Complex(Complex &c)
{
cout << "Copy constructor called " << endl;
re = c.re;
im = c.im;
}


void Complex::print()
{
cout << "real = " << re << endl;
cout << "imaginary = " << im << endl;
}

int main()
{
Complex a = 2;
a.print();
Complex b = a;
b.print();
}

最佳答案

当你写作时

Complex a = 2;

编译器不会使用 0 作为默认参数直接调用 Complex 构造函数来构建 a,而是会考虑是否可以将 2“转换”为 >复杂

要进行转换,它将找到您的 Complex(re,im) 版本并可以使用它,这要归功于默认值以及您没有声明构造函数 explicit,但随后它必须找到一种方法将此值传输到 a

这个“传输”的工具可以是复制构造函数。然而,可以用 Complex(re,im) 构建的复数值是一个临时值,并且由于 C++ 中的某些可疑原因,您不允许将临时值作为对函数的非常量引用。

因此您的复制构造函数不能与临时对象一起使用,并且编译器被卡住,因为无法使用 2 初始化 a

如果您声明您的复制构造函数而不是接受 const 引用,那么可以将临时对象传递给您的复制构造函数以初始化 a,因此一切都如您所愿。

直接初始化 a 可以使用语法 Complex a(2) 完成,在这种情况下不需要使用复制构造函数。

另请注意,当您使用语法 Complex a = ... 时可能会很奇怪,编译器必须检查使用复制构造函数是否合法,但一旦合法性得到检查允许不调用它并使用直接初始化。换句话说,即使您需要声明您的复制构造函数接受 const 引用以便能够编译,编译器实际上可能会跳过该部分并直接构建 a 而无需调用复制构造函数(即使复制构造函数 - 就像你的情况一样 - 有副作用)。添加这条看似疯狂的规则是为了能够在生成的代码中进行一些优化。

关于C++ 默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4856292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com