关于c++的拷贝函数的问题:怎样把用默认构造函数初始化的对象c1通过拷贝构造函数初始化c3.
答案:2 悬赏:80
解决时间 2021-03-12 20:44
- 提问者网友:熱戀丶瘋
- 2021-03-12 14:02
#include"iostream"
#include"cstdlib"
using namespace std;
class Complex
{
private:
double real,image;
public:
Complex()
{
real=20;
image=40;
};
Complex(double a,double b)
{
real=a;
image=b;
};
Complex(Complex &d);
void display()
{
if(image>=0)
{cout< if(image<0)
{cout< }
};
int main()
{
Complex c1();
Complex c2(0,0);
Complex c3(c1); //cannot convert parameter 1 from 'class Complex (void)' to 'class Complex &'
cout<<"c1的内容:"< c1.display();
cout<<"c2的内容:"< c2.display();
cout<<"c3的内容:"< c3.display();
return 0;
}
Complex::Complex(Complex &d)
{
real=d.real;
image=d.image;
}
最佳答案
- 二级知识专家网友:何必打扰
- 2021-03-12 15:40
你程序编译不过的地方是c1的定义,修改如下即可:
int main()
{
Complex c1;// ();
Complex c2(0, 0);
Complex c3(c1); //cannot convert parameter 1 from 'class Complex (void)' to 'class Complex &'
cout << "c1的内容:" << endl;
c1.display();
cout << "c2的内容:" << endl;
c2.display();
cout << "c3的内容:" << endl;
c3.display();
return 0;
}c++编译器解释代码时时优先解释为函数的,你的那种写法,它将c1当做是一个函数,你那句被当做了一个函数声明。直接Complex c1;它就已经是调用了默认构造函数的。
其实你如果想调用拷贝构造函数,下面的语句就可以:
Complex c3 = c1;对于这里为什么是调用拷贝构造函数而不是赋值操作符,我个人理解是,变量第一次出现的时候,都是构造。
全部回答
- 1楼网友:陪伴是最长情的告白
- 2021-03-12 17:17
拷贝构造函数是构造函数的一种啊,并不存在冲突,它们的包含和被包含的关系。至于拷贝构造函数的用途,是在你产生临时对象,或者在复杂的复制语句当中的时候,代码会自动调用该函数,产生出一个对象供后面代码复制使用的。你没有的话,那么产生这个临时对象的时候就会出错,当然,你的代码只要不产生临时对象,拷贝构造函数要不要都无所谓了。并且,如果你的代码没有显示的添加构造函数,编译器会自动帮你生成一个默认的构造函数,一个拷贝构造函数和一个析构函数的。但是这些都是浅拷贝,遇到指针数据成员,就有出错的潜在危险了。
我要举报
大家都在看
推荐资讯