zoukankan      html  css  js  c++  java
  • 10.2 运算符重载函数作为类成员函数和友元函数

    Complex operator+(Complex &c2) 
    { Complex c;
    c.real=real+c2.real;
    c.imag=imag+c2.imag;
    return c;
    }
    //+是双目运算符,函数重载中只有一个参数,实际上运算符重载函数有两个参数,是由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this
    //指针隐士的访问对象成员函数。
    Complex operator+(Complex *this,Complex &c2)
    {return Complex(this->real+c2.real,this->imag+c2.imag);}
    //运算符重载函数可以作为类的成员函数,还可以作为非成员函数。例:
    #include<iostream>
    using namespace std;
    class Complex
    {
    public:
    	Complex(){real=0;imag=0;}
    	Complex(int r,int i){real=r;imag=i;}
    	void display();
    	friend Complex operator+(Complex &c1,Complex &c2);//将运算符在Complex类中的成员函数 改为类的友元函数,应同时将运算符函数参数改为两个因为,this隐试指针只对类的成员函数有作用
    
    private:
    	int real;
    	int imag;};
    Complex operator+(Complex &c1,Complex &c2)
    {return Complex(c1.real+c2.real,c1.imag+c2.imag);}//Complex 保证返回值类型和该对象类型一致
    void Complex::display()
    {
    	cout<<"("<<real<<','<<imag<<"i)"<<endl;
    }
    int main()
    {
    	Complex c1(3,4),c2(5,-10),c3;
    	c3=c1+c2;
    	cout<<"c1=";
    	c1.display();
    	cout<<"c2";
    	c2.display();
    	cout<<"c1+c2=";
    	c3.display();
    	return 0;
    }
    //什么时候用成员函数方式,什么时候用友元函数?
    //如果将运算符作为成员函数,它可以通过this指针自由的访问本类的数据成员,因此可以少写一个函数的参数。但是必须要求运算表达试第一个参数(即运算符的左操作数)是类的对象。
    如果将一个复数和一个整数相加,(c1+i)可以将运算符重载函数作为类成员函数:
    
    Complex Complex::operator+(int &i)
    return (Complex(real+i,imag);}
    //注意在表达式中重载的运算符,+左侧应为Complex类的对象,如c3=c2+i;不能写成c3=i+c2;
    
    //如果运算符左侧的操作对象属于C++标准类型(如int)或其他类的对象,则运算符重载函数不能作为成员函数,如果函数还必须要访问类的私有成员,则必须声明为友元函数
    friend Complex operator+(int &i,Complex &c)//第一个参数可以不是类对象
    //在类外定义友元函数
    Complex operator+(int &i,Complex &c)
    {return Complex(i+c.real,c.imag);}

    //C++规定,有的运算符(如赋值运算符= 、下标运算符[] 、函数调用运算符() 、 ->、new、delete )必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“<<”和流提取运算符“>>”、类型转换运算符)。


  • 相关阅读:
    初识数据库与SQL语句
    初始面向对象
    集合与深浅copy
    函数进阶
    函数操作
    文件操作
    生成器与列表生成式
    函数名的本质,闭包和迭代
    小数据库
    DAY 5 字典
  • 原文地址:https://www.cnblogs.com/sxy201658506207/p/7586430.html
Copyright © 2011-2022 走看看