C++在包含复制构造函数时给出错误



我是C++的新手,我读过关于构造函数的书,我做了一个程序
下面是代码:

#include<iostream>
using namespace std;
class Demo{
public:
int a;
Demo(int x,int y){
cout<<"I am default constructor";
}
Demo(Demo &c){
cout<<"I am copy Constructor";
}
};
int main(){
Demo c2=Demo(5,7);
Demo c3=c2;
cout<<"The value is: "<<c2.a;
}

这段代码一直运行良好,直到我在类中添加了复制构造函数和主函数中的第二行。一旦我添加了这些行,它就会在主函数的第一行中显示错误

错误显示:

error: no matching function for call to 'Demo::Demo(Demo)'
note: candidates are:
note: Demo::Demo(Demo&)
note:   no known conversion for argument 1 from 'Demo' to 'Demo&'
note: Demo:Demo(int,int)
note:   candidate expects 2 arguments, 1 provided

我的第一个问题是,我在构造函数中传递两个参数,那么为什么编译器不能区分和调用正确的构造函数?
我的第二个问题是,如果我把main的第一行改成这样:
Demo c2(5,7);
,那么它就可以工作了。为什么会这样

提前感谢您为提供的任何帮助

我的第一个问题是,我在构造函数中传递了两个参数,那么为什么编译器不能区分和调用正确的构造函数?

编译器正在调用主中行右侧的Demo(int x,int y)构造函数

Demo c2 = Demo(5,7);
^ ^
| |
| +------- call Demo(int x,int y) to construct an r-value Demo object
|
+--------- call Demo(Demo&) copy constructor to construct a Demo object

但是,r值不能绑定到非常数引用。所以这行是(试图(构造两个Demo对象。只有一个成功了。

r值可以绑定到const引用,因此解决方案是添加const:

Demo(const Demo &c)

我的第二个问题是,如果我把main的第一行改成这样:
Demo c2(5,7);
,那么它工作得很好。为什么会这样?

在这种情况下,将调用适当的构造函数。同样,将const添加到您的复制构造函数将清除此问题。

Demo c2=Demo(5,7);

称为复制初始化。复制初始化需要调用复制构造函数,这就是添加显式复制构造函数后出现错误的原因。来自cppreference的复制构造函数页面:

无论何时从同一类型的另一个对象初始化对象(通过直接初始化或复制初始化(,都会调用复制构造函数(除非重载解析选择了更好的匹配或取消了调用(,这包括。。。

由于您的复制构造函数是

Demo(Demo &c)

这会导致一个问题,因为它试图将一个非常量的左值绑定到一个右值。要解决这个问题和第二个错误,请修改您的复制构造函数以获取常量引用

Demo(const Demo &c)

我的第二个问题是,如果我把main的第一行改成这样:演示c2(5,7(;那么它工作得很好。为什么会这样?

在这种情况下,将不再调用复制构造函数。相反,您的重载构造函数

Demo(int x,int y)

直接调用,因此在这种情况下永远不会调用复制构造函数。

相关内容

最新更新