zoukankan      html  css  js  c++  java
  • C++运算符重载(友元函数方式)

    我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数。

    当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->。

    重载为友元函数的运算符重载函数的定义格式如下:

    friend 函数类型 operator 运算符(形参表) 
    { 
        函数体; 
    } 
     

    一、程序实例

    //运算符重载:友元函数方式
    #include <iostream.h>
    
    class complex //复数类
    {
    public:
        complex(){ real = imag = 0;}
        complex(double r, double i)
        {
            real = r;
            imag = i;
        }
        friend complex operator + (const complex &c1, const complex &c2); //相比于成员函数方式,友元函数前面加friend,形参多一个,去掉类域
        friend complex operator - (const complex &c1, const complex &c2); //成员函数方式有隐含参数,友元函数方式无隐含参数
        friend complex operator * (const complex &c1, const complex &c2);
        friend complex operator / (const complex &c1, const complex &c2);
    
        friend void print(const complex &c); //友元函数
    
    private:
        double real; //实部
        double imag; //虚部
    
    };
    
    complex operator + (const complex &c1, const complex &c2) 
    {
        return complex(c1.real + c2.real, c1.imag + c2.imag);
    }
    
    complex operator - (const complex &c1, const complex &c2)
    {
        return complex(c1.real - c2.real, c1.imag - c2.imag);
    }
    
    complex operator * (const complex &c1, const complex &c2)
    {
        return complex(c1.real * c2.real - c1.imag * c2.imag, c1.real * c2.real + c1.imag * c2.imag);
    }
    
    complex operator / (const complex &c1, const complex &c2)
    {
        return complex( (c1.real * c2.real + c1.imag * c2. imag) / (c2.real * c2.real + c2.imag * c2.imag), 
            (c1.imag * c2.real - c1.real * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag) );
    }
    
    void print(const complex &c) 
    {
        if(c.imag < 0)
            cout<<c.real<<c.imag<<'i'<<endl;
        else
            cout<<c.real<<'+'<<c.imag<<'i'<<endl;
    }
    
    int main()
    {    
        complex c1(2.0, 3.5), c2(6.7, 9.8), c3;
        c3 = c1 + c2;
        cout<<"c1 + c2 = ";
        print(c3); //友元函数不是成员函数,只能采用普通函数调用方式,不能通过类的对象调用
    
        c3 = c1 - c2;
        cout<<"c1 - c2 = ";
        print(c3);
    
        c3 = c1 * c2;
        cout<<"c1 * c2 = ";
        print(c3);
    
        c3 = c1 / c2;
        cout<<"c1 / c2 = ";
        print(c3);
        return 0;
    }

    二、程序运行结果 


    从运行结果上我们就可以看出来,无论是通过成员函数方式还是采用友元函数方式,其实现的功能都是一样的,都是重载运算符,扩充其功能,使之能够应用于用户定义类型的计算中。

    三、两种重载方式(成员函数方式与友元函数方式)的比较

    一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。因为,它如果被重载为友元函数,将会出现与赋值语义不一致的地方。

  • 相关阅读:
    用数据泵技术实现逻辑备份Oracle 11g R2 数据泵技术详解(expdp impdp)
    用mysql实现类似于oracle dblink的功能
    统计1的个数
    转置字符串,其中单词内的字符需要正常
    经典排序之归并排序
    公共子序列与公共子串问题
    placement new (转)
    数组排序组合最小数字
    实现两个数相加不用四则运算
    操作系统中作业、线程、进程、内存管理、垃圾回收以及缓存等概念
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/4637551.html
Copyright © 2011-2022 走看看