• 运算符重载


    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;
    }
  • 相关阅读:
    shell编程系列5--数学运算
    qperf测量网络带宽和延迟
    使用gprof对应用程序做性能评测
    [转]极不和谐的 fork 多线程程序
    Emacs显示光标在哪个函数
    Iterm2的一些好用法
    [转]最佳日志实践
    Deep Introduction to Go Interfaces.
    CGo中传递多维数组给C函数
    seaweedfs 源码笔记(一)
  • 原文地址:https://www.cnblogs.com/jian1573/p/2793503.html
Copyright © 2020-2023  润新知