参考: http://wenku.baidu.com/view/6075e19951e79b8968022606.html
1. 用独立函数重载运算符 :
#include <iostream>
#include <string>
using namespace std;
class complex
{
public:
//存
void setreal(double r){real = r;}
void setimage(double i){image =i;}
//取
double getreal(){return real;}
double getimage(){return image;}
//构造函数:初始化用
complex(double r=0,double i=0){ real = r;image =i;}
void show() {cout<<real<<" + "<<image<<"i"<<endl;}
protected:
private:
double real;
double image;
};
// 独立函数重载运算符+: 函数名为"operator+",返回值类型为 complex
complex operator+(complex &x,complex &y)
{
complex z;
double a,b;
a = x.getreal()+y.getreal();
b = x.getimage()+y.getimage();
z.setreal(a);
z.setimage(b);
return z;
}
void main()
{
complex x1(12,12);
x1.show();
complex x2(13,13);
x2.show();
complex x3;
x3 = operator + (x1,x2);
x3.show();
}
调用形式: x3 = operator + (x1,x2); "operator +" 是函数名,跟普通的函数调用一样.

2. 类的成员函数形式:
x3 =x1+x2; // 等同于 x3 = x1.operator+(x2);
实际是 x1 是对象 operator+ 是其成员函数,x2是传入的参数,
故x1调用函数即x1.operator+(x2);
本例中 是在类的定义外面实现成员函数的.
// 这里实现:
complex complex::operator+(const complex &x)
{
return complex(this->real+x.real,this->image+x.image);
}
#include <iostream>
#include <string>
using namespace std;
class complex
{
public:
//存
void setreal(double r){real = r;}
void setimage(double i){image =i;}
//取
double getreal(){return real;}
double getimage(){return image;}
//构造函数:初始化用
complex(double r=0,double i=0){ real = r;image =i;}
void show() {cout<<real<<" + "<<image<<"i"<<endl;}
// 以类的成员函数重载运算符+, 这里现申明,在类外实现
complex operator +(const complex &x);
protected:
private:
double real;
double image;
};
// 这里实现:
complex complex::operator+(const complex &x)
{ return complex(real+x.real,image+x.image);}
void main()
{
complex x1(12,12);
x1.show();
complex x2(13,13);
x2.show();
complex x3;
x3 =x1+x2; // 等同于 x3 = x1.operator+(x2);
x3.show();
}
3. 友元函数形式:
下面的代码是没有问题,但是在VC6.0中 友元不能访问私有变量 (VC6.0的一个bug),因此在VC6.0中无法编译通过.
我得考虑用 dev 这类的编译器了.
#include <iostream>
#include <string>
using namespace std;
// 定义一个复数类
class complex
{
public:
//存
void setreal(double r){real = r;}
void setimage(double i){image =i;}
//取
double getreal(){return real;}
double getimage(){return image;}
//构造函数:初始化用
complex(double r=0,double i=0){ real = r;image =i;}
void show() {cout<<real<<" + "<<image<<"i"<<endl;}
// 以类的 友元成员函数重载运算符+, 这里现申明,在类外实现
friend complex operator +(const complex &a,const complex &b);
protected:
private:
double real;
double image;
};
// 友元成员函数重载运算符+ 实现
complex operator +(const complex &a,const complex &b)
{
complex z;
z.real = a.real+b.real;
z.image = a.image + b.image;
return z;
}
void main()
{
complex x1(12,12);
x1.show();
complex x2(13,13);
x2.show();
complex x3;
x3 =x1+x2; // 这里是谁调用友元函数? 这样写: x3 = operator+(x1,x2) 也对,比较好理解.
x3.show();
}
本文详细介绍了使用独立函数和类成员函数重载运算符的方法,通过C++实现复数类的加法操作,并探讨了友元函数在重载运算符时的应用。重点展示了如何在类外实现运算符函数,以及类内实现成员函数的重载过程,同时解释了友元函数在访问私有成员时的限制和解决办法。
863

被折叠的 条评论
为什么被折叠?



