运算符重载

1 c++的4个主要特点: 抽象, 封装, 继承和多态; 抽象, 封装是基础, 继承是关键, 多态是补充;

2 多态是指不同的对象面对不同的消息产生不同的行为;

3 函数重载和运算符重载都是简单一类多态性;

4 函数的重载: 给同一函数名予以不同的意义;

5 C++中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是成员函数,也可以是非成员函数;

6 定义这种重载函数时要求函数的参数的数量或类型至少有一处不同。而对于返回值的类型没有要求,可以相同,也可以不同,那种参数个数和类型都相同,仅仅返回值不同的重载函数是非法的;

7 重载函数的意义在于它可以用相同的名字访问一组相互关联的函数,由编译程序来进行选择,因而这将有助于解决程序复杂性问题;

运算符重载就是赋予已有的运算符多重含义, 本质是函数的重载, 是写一个函数解释某个运算符在某个类中的含义;

9 运算符重载后, 其原有的功能不会改变和消失;

10 运算符重载的方法: 函数类型 operator 运算符 ( 形参列表 );

11 运算符重载的规则:

  1 不能自定义新的运算符,只能重载原有的运算符;

  2 不能重载的运算符只有 5  个:  

    . ( 成员访问运算符 )   .* ( 成员指针访问运算符 )  // 为了保证访问成员的功能不被改变;

    :: ( 域运算符 )    sizeof ( 长度运算符 )  // 运算对象是类型而不是变量不具备重载的特征

    ?: ( 条件运算符 ) 

  3 不能改变运算符操作对象的个数 ( 单目运算符不能重载成双目运算符, 双目运算符不能重载成单目运算符 );

  4 重载运算符的函数不能有默认值 ( 有可能改变运算符参数的个数, 与第三点矛盾 );

  5 不能改变运算符的优先级;

  6 不能改变运算符的结合性;

  7 重载运算符必须和自定义的类对象一起用,其参数至少有一个是类对象或者引用;

  8 运算符重载函数可以是成员函数也可以是友元函数;

12 使用重载运算符时应遵循如下原则:

  1  重载运算符含义必须清楚;

  2  重载运算符不能有二义性;

13 运算符重载函数的两种形式 : 成员函数形式和友元函数形式;这两种形式都可访问类中的私有成员;

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
class complex
{
public:
    complex() { real=imag=0; }
    complex(double r, double i){
        real = r, imag = i;
    }
    // 成员函数 
    complex operator +(const complex &c)// 类内定义 
    {
        return complex(real + c.real, imag + c.imag);
    } 
    complex operator -(const complex &c); //类外定义 
    // 友元函数
    friend complex operator *(const complex &c, const complex &d );   
    // << 和 >> 只能重载成友元函数或者普通函数; 
    friend ostream& operator << ( ostream&, complex & );// 重载 <<  
    friend istream& operator >> ( istream&, complex & );// 重载 >>  
    
private:
    double real, imag;
}; 

inline complex complex::operator -(const complex &c)
{
    return complex(real - c.real, imag - c.imag);
} 
 complex operator *(const complex &c, const complex &d )
{
    return complex(c.real * d.real - c.imag * d.imag, c.real * d.imag + c.imag * d.real);
} 
ostream& operator << ( ostream &output, complex &c )
{
    if( c.imag>=0 ) 
        output<< c.real<<"+"<<c.imag<<"i"<<endl;
    else output<< c.real<<"-"<<c.imag<<"i"<<endl;
    return output;
}
istream& operator >> ( istream &input, complex &c )
{
    cout<<" 请输入复数的实部和虚部"<<endl;
    input>>c.real>>c.imag;
    return input; 
}
int main( )
{
    complex c1, c2, h, c, j;
    cin>>c1>>c2;
    h=c1+c2;
    c=c1-c2;
    j=c1*c2;
    cout << "c1="<<c1<< endl;
    cout << "c2="<<c2<< endl;
    cout << "c="<<c<< endl;
    cout << "h="<<h<< endl;
    cout <<"j="<<j<< endl;
    return 0;
}
原文地址:https://www.cnblogs.com/jian1573/p/2793503.html