一个让人费解的C++语法问题

来源:百度知道 编辑:UC知道 时间:2024/05/14 08:51:40
如果注释掉第五句就会出错,为什么啊?
#include<iostream.h>
class Complex
{
public:
Complex(){real=0;imag=0;}//如果注释掉这句就会出错,为什么啊?
Complex(double r,double i):real(r),imag(i){}
Complex(double r){real=r;imag=0;}//转换构造函数,用于将实数转换成类型
friend Complex operator +(Complex c1, Complex c2);
friend ostream& operator <<(ostream& output,Complex&c1);
void display();
private:
double real;
double imag;
};
Complex operator +(Complex c1, Complex c2)
{
return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
ostream& operator <<(ostream& output,Complex&c)
{
output<<"("<<c.real;
if(c.imag>0)
output<<"+"<<c.imag<<"i"<<")";
else
output<<c.imag<<"i"<<")";
return output;
}
int main()
{
Complex c1(0.5,8.6),c2(-6.3,1.03),t1,t2;
t1=c1+2.5;

注释掉后,你的构造函数的重载就只剩下两个类型
Complex(double r,double i)
Complex(double r)
因此t1和t2就没有合适的构造函数了。
当然,如果你将所有的构造函数的重载都去掉后,类会有一个默认的构造函数,就是Complex(),这时后t1,t2就可以进行构造。但是,此时
Complex(c1.real+c2.real,c1.imag+c2.imag);这一句就不能用了,因为没有
Complex(double r,double i) 这个重载;而且,因为real和imag没有被初始化,这时你的t1,t2的值是不确定的。所以说,
Complex(){real=0;imag=0;}
Complex(double r,double i):real(r),imag(i){}
Complex(double r){real=r;imag=0;}
这三个构造函数都是必要的。

注释掉后就没有缺省构造函数了,
Complex t1,t2;就没办法构造了.

你注销掉了默认的构造函数,因而下面的的重载不能用