zoukankan      html  css  js  c++  java
  • c++友元实现操作符重载

    运算符重载的本质是一个函数

    #include <iostream>
    using namespace std;
    
    class A {
    private:
        int m_a;
        int m_b;
    
        friend A operator+(A &a1, A &a2);//友元函数訪问私有属性。实现二元运算符重载
    
        friend A operator++(A &a); //友元函数訪问私有属性。实现一元运算符重载(前置)
    
        /*后置为避免与前置函数定义同样,使用占位符int。告诉编译器是后置运算符重载*/
        friend A operator++(A &a, int); //友元函数訪问私有属性。实现一元运算符重载(后置)
    
        friend class B; //友元类,訪问私有属性。

    若B类是A类的友员类,则B类的全部成员函数都是A类的友员函数 public: A(int a){ this->m_a = a; } A(int a, int b) { m_a = a; m_b = b; } void show() { cout << m_a << endl; } }; class B { private: A *pObjA = new A(21); public: void showA() { cout << pObjA->m_a << endl; } }; A operator+(A &a1, A &a2) { A tmp(a1.m_a + a2.m_a, a1.m_b + a2.m_b); return tmp; } A operator++(A &a) { //前置++ a.m_a++; a.m_b++; return a; } A operator++(A &a, int) { //后置++ A tmp = a; a.m_a++; a.m_b++; return tmp; } int main() { A a1(1, 9); A a2(3, 4); A a3 = a1 + a2; a3.show(); ++a3; a3.show(); a3++; a3.show(); return 0; }

    class Complex
    {
    public:
        int a;
        int b;
        friend Complex operator+(Complex &c1, Complex &c2);
    public:
        Complex(int a=0, int b=0)
        {
            this->a = a;
            this->b = b;
        }
    
    public:
        void printCom()
        {
            cout<<a<<" + "<<b<<"i "<<endl;
        }
    
    private:
    };
    
    /*
    Complex myAdd(Complex &c1, Complex &c2)
    {
        Complex tmp(c1.a+ c2.a, c1.b + c2.b);
        return tmp;
    }
    */
    
    Complex operator+(Complex &c1, Complex &c2)
    {
        Complex tmp(c1.a+ c2.a, c1.b + c2.b);
        return tmp;
    }
    
    void main()
    {
        Complex c1(1, 2), c2(3, 4);
    
        //Complex c3 = c1 + c2;  //用户自己定义类型 编译器无法让变量相加
        //Complex myAdd(Complex &c1, Complex &c2);
    
        //1 普通函数
        //Complex c3 = myAdd(c1, c2);
        //c3.printCom();
    
        //2 operator+ 函数名称
        //Complex c3 = operator+(c1, c2);
        //c3.printCom();
    
        //3 +替换 函数名
        Complex c3 = c1 + c2; //思考C++编译器怎样支持操作符重载机制的 (依据类型)
        c3.printCom();
    {
    int a =0, b = 0, c; //基础类型C++编译器知道怎样加减 
    c = a +b;
    }
    
        //4 把Complex类变成私有属性
        //friend Complex operator+(Complex &c1, Complex &c2);
    
        cout<<"hello..."<<endl;
        system("pause");
        return ;
    }
    

    为vector类重载流插入运算符和提取运算符

    class vector
    { 
    public :
        vector( int size =1 ) ;       
        ~vector() ;
        int & operator[]( int i ) ;
        friend ostream & operator << ( ostream & output , vector & ) ;
        friend istream & operator >> ( istream & input, vector & ) ;
    private :  
        int * v ;     
        int len ;
    };
    
    vector::vector( int size ) 
    { 
        if (size <= 0 || size > 100 )
        { 
            cout << "The size of " << size << " is null !
    " ; abort() ;  
        }
        v = new int[ size ] ;  len = size ;
    }
    
    vector :: ~vector() 
    { 
        delete[] v ;  
        len = 0 ; 
    }
    
    int &vector::operator[]( int i )        
    { 
        if( i >=0 && i < len )  return v[ i ] ;
        cout << "The subscript " << i << " is outside !
    " ;  abort() ;
    }
    ostream & operator << ( ostream & output, vector & ary )
    { 
        for(int i = 0 ; i < ary.len ; i ++ )  
            output << ary[ i ] << "  " ;
        output << endl ;
        return output ;
    }
    istream & operator >> ( istream & input, vector & ary ) 
    { 
        for( int i = 0 ; i < ary.len ; i ++ )  
            input >> ary[ i ] ;
        return  input ;
    }
    
    void main()
    { 
        int k ;
        cout << "Input the length of vector A :
    " ;     
        cin >> k ;
        vector A( k ) ;
        cout << "Input the elements of vector A :
    " ;     
        cin >> A ;
        cout << "Output the elements of vector A :
    " ;
        cout << A ;
        system("pause");
    }
    
  • 相关阅读:
    GUI 之 JDialog弹窗
    GUI Swing 之 JFrame窗体
    GUI 键盘监听事件
    GUI 窗口监听事件
    GUI 鼠标监听事件,模拟画图工具
    shell编程
    Ubuntu20.04 Linux初识
    rlwrap的使用
    5个相见恨晚的Linux命令,每一个都非常实用
    Bash初识与常用命令
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6901098.html
Copyright © 2011-2022 走看看