C++ 运算符函数重载,语法练习

本文详细介绍了使用独立函数和类成员函数重载运算符的方法,通过C++实现复数类的加法操作,并探讨了友元函数在重载运算符时的应用。重点展示了如何在类外实现运算符函数,以及类内实现成员函数的重载过程,同时解释了友元函数在访问私有成员时的限制和解决办法。

 参考: 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();
}	


 

  

 
 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值