无法理解编译器在复制构造函数上引发的错误消息[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法理解编译器在复制构造函数上引发的错误消息[关闭]相关的知识,希望对你有一定的参考价值。
#include <iostream>
using namespace std;
class dummy
{
private:
int a,b,*p;
public:
void setdata(int x,int y,int z)
{
a=x;
b=y;
p=&z;
}
void showdata()
{
cout<<"a "<<a<<"b "<<b<<" pointer address c "<<&p<<endl;
}
dummy(dummy &d)
{
a=d.a;
b=d.b;
p=d.p;
cout<<"a "<<a<<"b "<<b<<" pointer address c "<<&p<<endl;
}
dummy(dummy &d)
{
d.a;b=d.b;p=d.p;
}
};
int main()
{
dummy d1;//error is here;
d1.setdata(3,4,5);
dummy d2=d1;
d2.showdata();
d1.showdata();
return 0;
}
提出错误
:/ root / copy deep shallow / main.cpp | 15 | error:没有匹配函数来调用'dummy :: dummy()'|
我无法理解为什么会出现错误消息以及此问题的解决方案是什么
该类没有默认构造函数,因为存在显式定义的复制构造函数
dummy(dummy &d){a=d.a;b=d.b;p=d.p;}
(应该使用参数const dummy &
声明)
但是在这个宣言中
dummy d1;
需要缺少默认构造函数。
您已明确定义默认构造函数。
考虑到例如这个成员函数
void setdata(int x,int y,int z)
{a=x;b=y;p=&z;}
导致未定义的行为,因为指针p
在退出函数后将具有无效值,因为局部变量(参数)z
将被销毁。
dummy()
{
}
dummy(dummy &d)
{
a=d.a;
b=d.b;
p=d.p;
cout<<"a "<<a<<"b "<<b<<" pointer address c "<<&p<<endl;
}
这将解决您的问题。
通过这种方式,您可以定义默认构造函数(1st)和复制构造函数(2nd)
在您的代码中,您没有提供默认构造函数和两个复制构造函数,因此编译器会先抱怨缺少构造函数,但是什么时候会解决它会因为模糊复制构造函数而引发另一个错误(编译器会告诉您我不是知道哪一个电话)。
作为第三个错误,setData()将导致在销毁z后p的未定义行为无效。
你的问题不是复制构造函数,而是默认构造函数。无论何时用C ++编写类,编译器都会生成一组默认函数,因此您不必显式键入它们。那些是:
- 默认构造函数:
dummy::dummy()
- 复制构造函数:
dummy::dummy(const dummy&)
- 复制赋值运算符:
dummy& dummy::operator=(const dummy&)
- 驱逐舰:
dummy::~dummy()
在C ++ 11标准中,您还可以获得移动构造函数和移动赋值运算符,但这些并不重要。
编译器会为您添加这些类,但如果您定义任何构造函数,它将不会生成隐式默认构造函数。
如果您想拥有默认构造函数(并且能够在代码中使用dummy d1;
),请将以下构造函数定义添加到类中:
dummy(){}
或更好,如果您使用C ++ 11标准:
dummy() = default;
附注:在这种情况下,您不需要显式复制构造函数。您的实现只是将每个字段的内容复制到新对象,因此隐式复制构造函数(由编译器生成)就足够了。
以上是关于无法理解编译器在复制构造函数上引发的错误消息[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如果我尝试在不同的公共类中将数组作为参数传递,为啥我的构造函数无法在 Java 中编译?