关于重载构造函数的问题,谢谢了! ^@^
下面有两段代码,只有红色标记部分的构造函数是不相同的。第二段代码在编译时候没错,但是运行时候就提示错误。
为什么呢?第二个代码不是构造函数重载吗?错在哪里?
谢谢!
^@^
正确的代码:
#include <iostream>
using namespace std;
class imaginary
{
private:
int x,y;
public:
imaginary(int =0,int =0);
friend imaginary add(imaginary,imaginary);
void show();
};
imaginary::imaginary(int a,int b)
{
x=a;
y=b;
}
imaginary add(imaginary m,imaginary n)
{
imaginary mm;
mm.x=m.x+n.x;
mm.y=m.y+n.y;
return mm;
}
void imaginary::show()
{
cout<<x<<endl<<y<<endl;
}
void main()
{
imaginary wer1(2,3),wer2(-2,3),wer;
wer=add(wer1,wer2);
wer.show();
}
错误的代码:
#include <iostream>
using namespace std;
class imaginary
{
private:
int x,y;
public:
imaginary(int,int);
imaginary();
friend imaginary add(imaginary,imaginary);
void show();
};
imaginary::imaginary(int a,int b)
{
x=a;
y=b;
}
imaginary add(imaginary m,imaginary n)
{
imaginary mm;
mm.x=m.x+n.x;
mm.y=m.y+n.y;
return mm;
}
void imaginary::show()
{
cout<<x<<endl<<y<<endl;
}
void main()
{
imaginary wer1(2,3),wer2(-2,3),wer;
wer=add(wer1,wer2);
wer.show();
}
[解决办法]
构造函数imaginary();
没有实现,应该编译也通不过
[解决办法]
第二个代码没有定义默认构造函数,当你使用imaginary wer1(2,3),wer2(-2,3),wer;的时候没有办法构造wer了,所以不能通过的。而第一个代码之所以能够通过的原因就是使用了默认参数,当你没有提供参数的时候就使用了默认参数。
关于默认构造函数,当编译器认为需要合成的时候才合成默认构造函数。当已经有自己定义的任何构造函数,那么编译器便认为没有必要去合成默认构造函数了。所以最好自行定义
[解决办法]
声明后未定义.这是两个不同的函数,两个都要定义,也就是楼上说的"实现"
[解决办法]
imaginary()的后面加上一个{},去掉分号应该就好了
重载函数是不同的函数体,要分别实现