
对c++中重载的理解(详细些)
#include"iostream"usingnamespacestd;classcomplex{public:complex(doubler=0.0,doublei=0...
#include"iostream"
using namespace std;
class complex
{
public:
complex(double r=0.0,double i=0.0){real=r,img=i;}
complex operator+(complex c2;)
void display();
private:
double real;
double imag;
};
complex complex::operator +(complex c2) //这步不是很理解
{
return complex(real+c2.real,imag+c2.imag);
}
void complex::display()
{
cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
complex c1(5,4),c2(2,10),c3;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
c3=c1+c2;
cout<<"c3+c2=";
c3.display();
}
complex complex::operator +(complex c2) //complex c2有什么作用呢 +号是双目运算符 但为什么只
//有complex c2 一个数据成员呢 很是不理解 展开
using namespace std;
class complex
{
public:
complex(double r=0.0,double i=0.0){real=r,img=i;}
complex operator+(complex c2;)
void display();
private:
double real;
double imag;
};
complex complex::operator +(complex c2) //这步不是很理解
{
return complex(real+c2.real,imag+c2.imag);
}
void complex::display()
{
cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
complex c1(5,4),c2(2,10),c3;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
c3=c1+c2;
cout<<"c3+c2=";
c3.display();
}
complex complex::operator +(complex c2) //complex c2有什么作用呢 +号是双目运算符 但为什么只
//有complex c2 一个数据成员呢 很是不理解 展开
3个回答
展开全部
//楼上的回答的很好,但没有解答重点.
complex complex::operator +(complex c2) //这步不是很理解
{
return complex([this.]real+c2.real,[this.]imag+c2.imag);//这样就容易理解了
}
/*
“+” ,”-”是双目运算符,为什么在程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。
可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real。
在将运算符函数重载为成员函数后,如果出现含该运算符的表达式,如c1+c2,编译系统把它解释为c1.operator+(c2)
即通过对象c1调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。运算符重载函数的返回值是Complex类型,返回值是复数c1和c2之和(Complex(c1.real + c2.real,c1.imag+c2.imag))。
*/
//可参考:
http://zhidao.baidu.com/question/69566035.html
complex complex::operator +(complex c2) //这步不是很理解
{
return complex([this.]real+c2.real,[this.]imag+c2.imag);//这样就容易理解了
}
/*
“+” ,”-”是双目运算符,为什么在程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。
可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real。
在将运算符函数重载为成员函数后,如果出现含该运算符的表达式,如c1+c2,编译系统把它解释为c1.operator+(c2)
即通过对象c1调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。运算符重载函数的返回值是Complex类型,返回值是复数c1和c2之和(Complex(c1.real + c2.real,c1.imag+c2.imag))。
*/
//可参考:
http://zhidao.baidu.com/question/69566035.html
展开全部
complex complex::operator +(complex c2) //这步不是很理解
{
return complex(real+c2.real,imag+c2.imag);
}
函数最好写成complex complex::operator+(const complex& c2)
{
return complex(real+c2.real,imag+c2.imag);
}
这个函数返回一个complex的对象,重载的运算符是"+","+"的左边是对象本身,右边是另外一个对象,返回值也是一个对象
return语句通过调用complex的构造函数返回一个complex的对象
complex c1(5,4),c2(2,10),c3;
c3=c1+c2;
这2句,c1(5,4),c2(2,10)分别调用了构造函数c1.complex(5,4)和c2.complex(2,10),c3调用了c3.complex(0,0);
c3=c1+c2右边调用了c1.operator+(c2),因此函数体中参与运算的是c1和c2的引用(修改以后的版本),然后通过构造函数complex()返回一个complex对象,并且赋值给c3(赋值的过程中使用了默认复制构造函数,默认复制构造函数可以通过重载"="来自定义)
参数用const complex& c2而不用complex c2的原因:
1.2个都是可以的,但前者更好
2.后者是对象实参作为参数,在调用的时候需要复制一个c2的副本参与函数体运算,如果c2比较复杂的话,将会增加额外的系统开销
3.前者是一个对象的引用,调用的时候不会复制c2的副本,所以不产生额外的开销
4.为了保证c2不被意外改变,而且我们也不需要改变它,所以定义成const
{
return complex(real+c2.real,imag+c2.imag);
}
函数最好写成complex complex::operator+(const complex& c2)
{
return complex(real+c2.real,imag+c2.imag);
}
这个函数返回一个complex的对象,重载的运算符是"+","+"的左边是对象本身,右边是另外一个对象,返回值也是一个对象
return语句通过调用complex的构造函数返回一个complex的对象
complex c1(5,4),c2(2,10),c3;
c3=c1+c2;
这2句,c1(5,4),c2(2,10)分别调用了构造函数c1.complex(5,4)和c2.complex(2,10),c3调用了c3.complex(0,0);
c3=c1+c2右边调用了c1.operator+(c2),因此函数体中参与运算的是c1和c2的引用(修改以后的版本),然后通过构造函数complex()返回一个complex对象,并且赋值给c3(赋值的过程中使用了默认复制构造函数,默认复制构造函数可以通过重载"="来自定义)
参数用const complex& c2而不用complex c2的原因:
1.2个都是可以的,但前者更好
2.后者是对象实参作为参数,在调用的时候需要复制一个c2的副本参与函数体运算,如果c2比较复杂的话,将会增加额外的系统开销
3.前者是一个对象的引用,调用的时候不会复制c2的副本,所以不产生额外的开销
4.为了保证c2不被意外改变,而且我们也不需要改变它,所以定义成const
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
complex complex::operator +(complex c2) //这步不是很理解
//第一个complex表明这个函数返回值的类型,第二个complex表明作用域是来自于complex这个类的成员函数。
{
return complex(real+c2.real,imag+c2.imag);
//complex 表明返回值类型。
}
//第一个complex表明这个函数返回值的类型,第二个complex表明作用域是来自于complex这个类的成员函数。
{
return complex(real+c2.real,imag+c2.imag);
//complex 表明返回值类型。
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询