对运算符重载和友元函数的例子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对运算符重载和友元函数的例子相关的知识,希望对你有一定的参考价值。

以下是博主在学习完运算符重载和友元函数后编写的一个例子,实现一个复数的基本运算。
定义的头文件:

/******************************************************************
        complex.h                     Defination of the complex
******************************************************************/

#ifndef _complex_
#define _complex_
#include<cmath>
#include<iostream>
using std::sqrt ;
using std::ostream;   // Error :    ‘ostream’ does not name a type
using std::istream; 

class Complex{
private:
double real ;
double imag ;
public:
Complex( double real=0 , double imag=0 ) { this->real = real ;   this->imag = imag ; }
void zero() {   real = imag = 0 ; }
double module() {   return sqrt(real*real+imag*imag); }
double angle()  {   return atan2(imag,real); }

//     operator overloading
/******************************************************/

Complex operator+(const Complex & com) const;
Complex operator-(const Complex & com) const;
Complex operator*(const Complex & com) const ;
Complex operator/(const Complex & com) const;
Complex operator~() const;
/*******************************************************/

/******************************************************************/
//    template overloading  for the general operation of built-in type 

 Complex operator+(double value);
 Complex operator-(double value);
 Complex operator*(double value);
 Complex operator/(double value);

//   friend functions  
friend ostream & operator<<( ostream & os ,  Complex & com );
friend Complex operator+( double value , Complex & com );
friend istream & operator>>( istream & is ,  Complex & com );

friend Complex operator+( double value , Complex & com );
friend Complex operator-( double value , Complex & com );
friend Complex operator*( double value , Complex & com );
friend Complex operator/( double value , Complex & com );

};
#endif

实现的文件:

/***********************************************
             Realization of the Complex
************************************************/

#include "complex.h"
#include <iostream>
using std::ostream;
using std::istream;
/*
    Complex( double real=0 , double imag=0 ) { this->real = real ;   this->imag = imag ; }
    void zero() {   real = imag = 0 ; }
    double module() {   return sqrt(real*real+imag*imag); }
    double angle()  {   return atan2(imag,real); }

    //     Operator overloading

Complex operator+(const Complex & com) const;
Complex operator-(const Complex & com) const;
Complex operator*(const Complex & com) const ;
Complex operator/(const Complex & com) const;
Complex operator~() const;

//      Template overloading  for the general operation of built-in type 
 Complex operator+(double value);
 Complex operator-(double value);
 Complex operator*(double value);
 Complex operator/(double value);

//      Friend functions  
friend ostream & operator<<( ostream & os ,  Complex & com );
friend Complex operator+( double value , Complex & com );
friend istream & operator>>( istream & is ,  Complex & com );
friend Complex operator+( double value , Complex & com );
friend Complex operator-( double value , Complex & com );
friend Complex operator*( double value , Complex & com );
friend Complex operator/( double value , Complex & com );

*/

/***********************************************************
        Operator Overloading
***********************************************************/

Complex Complex::operator+(const Complex & com) const{
    Complex result ;
    result.real = this->real + com.real ;
    result.imag = this->imag + com.imag ;
    return result ;
}

Complex Complex::operator-(const Complex & com) const{
    Complex result ;
    result.real = this->real - com.real ;
    result.imag = this->imag - com.imag ;
    return result ;
}   

Complex Complex::operator*(const Complex & com) const{
    Complex result ;
    result.real = (this->real) * com.real - (this->imag*com.imag);
    result.imag = this->real*com.imag + this->imag*com.real ;
    return result ;
}

Complex Complex::operator/(const Complex & com) const{
    Complex result ;
    result.real = (this->real*com.real + this->imag*com.imag)/(com.real*com.real+com.imag*com.imag);
    result.real = (this->imag*com.real - this->real*com.imag)/(com.real*com.real+com.imag*com.imag);
    return result ;
}

Complex Complex::operator~()const{
    Complex result ;
    result.real = (this->real) ;
    result.imag = -this->imag  ;
    return result ;
}

/*******************************************************************************
    Template overloading  for the general operation of built-in type 
********************************************************************************/

Complex Complex::operator+(double value){
    Complex result ;
    result.real = this->real+value;
    result.imag = this->imag;

    return result ;
}

Complex Complex::operator-(double value){
    Complex result ;
    result.real = this->real-value;
    result.imag = this->imag;

    return result ;
}

Complex Complex::operator*(double value){
    Complex result ;
    result.real = this->real*value;
    result.imag = this->imag*value;

    return result ;
}

Complex Complex::operator/(double value){
    Complex result ;
    result.real = this->real/value;
    result.imag = this->imag/value;

    return result ;
}

/**********************************************************
             friend functions
***********************************************************/
ostream & operator<<( ostream & os ,  Complex & com ){
    os<<com.real<<‘+‘<<com.imag<<‘j‘;
    return os ;
}

istream & operator>>( istream & is ,  Complex & com ){
    std::cout<<"Enter the real part :";
    is>>com.real;
    is.clear();
    std::cout<<"Enter the image part:";
    is>>com.imag;

    return is ;
}

//    Behold this part , Never get the Istream wrong again !!!!!

Complex operator+( double value , Complex & com ){
    Complex result ;
    result.real = com.real+value;
    result.imag = com.imag;

    return result ;
}

Complex operator-( double value , Complex & com ){
    Complex result ;
    result.real = com.real-value;
    result.imag = com.imag;

    return result ;
}

Complex operator*( double value , Complex & com ){
    Complex result ;
    result.real = com.real*value;
    result.imag = com.imag*value;

    return result ;
}

Complex operator/( double value , Complex & com ){
    Complex result ;
    result.real = com.real/value;
    result.imag = com.imag/value;

    return result ;
}

测试文件:
#include "complex.h"
#include<iostream>

using namespace std ;

int main(){
    Complex a(3.0,4.0);
    Complex c ;
    Complex result ;

    while( std::cin>>c )
    {
        std::cout<<" c is "<<c<<‘
‘;
        std::cout<<" complex conjugate is "<<(result=~c)<<‘
‘;
        std::cout<<" a is "<<a<<‘
‘;
        std::cout<<" a + c is "<<(result=a+c)<<‘
‘;
        std::cout<<" a - c is "<<(result=a-c)<<‘
‘;
        std::cout<<" a * c is "<<(result=a*c)<<‘
‘;
        std::cout<<" a / c is "<<(result=a/c)<<‘
‘;
        std::cout<<" the mod   of c is "<<c.module()<<‘
‘;
        std::cout<<" the angle of c is "<<c.angle()<<‘
‘;
    }

    return 0 ;
}

在编写时,博主遇到了一个问题:
invalid initialization of non-const reference of type ‘Complex&’ from an rvalue of type ‘Complex’
这是由于函数的返回是一个暂时的量所导致的,所以需要将结果用一个变量保存起来,否则就会报错。
因此就有了以上的写法:(result=a/c)
关于这个问题可以参考:https://blog.csdn.net/u011068702/article/details/64443949

以上是关于对运算符重载和友元函数的例子的主要内容,如果未能解决你的问题,请参考以下文章

从一个二级题来看成员函数重载运算符和友元函数重载运算符

运算符重载和友元

类和对象——补充(运算符重载,static和explicit关键字和友元,内部类)

关于C++运算符重载和友元的概念

运算符重载的函数作为类的成员函数和友元函数

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?