码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 运算符重载

时间:2014-06-21 11:54:19      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   color   com   get   

#include <IOSTREAM>
using namespace std;

class Complex_cs
{
public:
	Complex_cs(double r, double i):real(r), image(i){}
	Complex_cs()
	{
		real = 0;
		image = 0;
	}
	void ReadDate()
	{
		cout << "real" << real <<endl;
		cout << "image" << image <<endl;
	}

	Complex_cs operator+(Complex_cs &complex);
    double GetReal()
	{
		return real;
	}

    double GetImage()
	{
		return image;
	}
private:
	double real;
	double image;
};


Complex_cs Complex_cs::operator+(Complex_cs &complex)
{
	return(Complex_cs(real + complex.GetReal(), image + complex.GetImage()));//return(Complex(real+compelx.real, ...))属于Complexl类,可直接调用
}
int main()
{
	Complex_cs complex1(5, 6), complex2(4, 3), complex3;

	complex3 = complex1 + complex2;
	complex3.ReadDate();
	return;
}

  

complex3 = complex1 + complex2;编译器在寻找函数时,若
operator+是类的函数,
会编译成complex1.operator+(complex2)
若operator+是类的友元函数,operator+(complex1, complex2)
++有前后两种,针对“++”和“--”这一特点,C++约定,在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。
#include <iostream>
using namespace std;
class Complex
{
   public:
   Complex( ){real=0;imag=0;}
   Complex(double r,double i){real=r;imag=i;}
   Complex operator + (Complex &c2);  //运算符“+”重载为成员函数
   friend ostream& operator << (ostream&,Complex&);  //运算符“<<”重载为友元函数
   private:
   double real;
   double imag;
};

Complex Complex::operator + (Complex &c2)//定义运算符“+”重载函数
{
   return Complex(real+c2.real,imag+c2.imag);
}
ostream& operator << (ostream& output,Complex& c) //定义运算符“<<”重载函数
{
   output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
   return output;
}

int main( )
{
   Complex c1(2,4),c2(6,10),c3;
   c3=c1+c2;
   cout<<c3;
   return 0;
}

  

可以看到在对运算符“<<”重载后,在程序中用“<<”不仅能输出标准类型数据,而且可以输出用户自己定义的类对象。用“cout<<c3”即能以复数形式输出复数对象c3的值。形式直观,可读性好,易于使用。

下面对怎样实现运算符重载作一些说明。程序中重载了运算符“<<”,运算符重载函数中的形参output是ostream类对象的引用,形参名output是用户任意起的。分析main函数最后第二行:
    cout<<c3;
运算符“<<”的左面是cout,前面已提到cout是ostream类对象。“<<”的右面是c3,它是Complex类对象。由于已将运算符“<<”的重载函数声明为Complex类的友元函数,编译系统把“cout<<c3”解释为
    operator<<(cout, c3)
即以cout和c3作为实参,调用下面的operator<<函数:
    ostream& operator<<(ostream& output,Complex& c)
    {
       output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
       return output;
    }
调用函数时,形参output成为cout的引用,形参c成为c3的引用。因此调用函数的过程相当于执行:
    cout<<″(″<<c3.real<<″+″<<c3.imag<<″i)″<<endl; return cout;
请注意,上一行中的“<<”是C++预定义的流插入符,因为它右侧的操作数是字符串常量和double类型数据。执行cout语句输出复数形式的信息。然后执行return语句。

请思考,return  output的作用是什么?回答是能连续向输出流插入信息。output是ostream类的对象,它是实参cout的引用,也就是cout通过传送地址给output,使它们二者共享同一段存储单元,或者说output是cout的别名。因此,return output就是return cout,将输出流cout的现状返回,即保留输出流的现状。

请问返回到哪里?刚才是在执行
    cout<<c3;
在已知cout<<c3的返回值是cout的当前值。如果有以下输出:
    cout<<c3<<c2;
先处理
    cout<<c3
即
   (cout<<c3)<<c2;
而执行(cout<<c3)得到的结果就是具有新内容的流对象cout,因此,(cout<<c3)<<c2相当于cout(新值)<<c2。运算符“<<”左侧是ostream类对象cout,右侧是Complex类对象c2,则再次调用运算符“<<”重载函数,接着向输出流插入c2的数据。现在可以理解了为什么C++规定运算符“<<”重载函数的第一个参数和函数的类型都必须是ostream类型的引用,就是为了返回cout的当前值以便连续输出。

  

c++ 运算符重载,布布扣,bubuko.com

c++ 运算符重载

标签:style   class   blog   color   com   get   

原文地址:http://www.cnblogs.com/jsy306/p/3794891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!