zoukankan      html  css  js  c++  java
  • c++多态性

    多态性:指同样的消息被不同类型的对象接收时有可能产生完全不同的行为(与之前类型兼容相反)

    多态性主要有三种表现形式:

    1、函数重载

    2、运算符重载

    3、虚函数

    数目运算符重载实例:(不可以重载的运算符:*   ::  ?:   sizeof)

    原则:1、不能改变原运算符的优先级和结合性

    2、不能改变操作数的个数

    3、经重载的运算符,其操作数中至少应该有一个是自定义类型。

    实现的形式有两种:友元函数或者类成员函数

    1、如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的类型。

    经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)。

    2、重载为类成员函数时 参数个数=原操作数个数-1 (后置++、--除外)

    3、 重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。

    4、如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以将此运算符重载为该类的非成员(通常为友元)函数。

    5、函数的形参代表依自左至右次序排列的各操作数。

    6、后置单目运算符 ++和--的重载函数,形参列表中要增加一个int,但不必写形参名。

     1 #include<iostream>
     2 using namespace std;
     3 class Complex
     4 {
     5 private:
     6     double real;
     7     double imag;
     8 public:
     9     Complex(double a,double b):real(a),imag(b)
    10     {}
    11     Complex()
    12     {}
    13     Complex operator +(Complex c1);重载为类成员函数
    14     Complex operator -(Complex c2);
    15     void display();
    16 
    17 };
    18 void Complex::display()
    19 {
    20     cout<<"("<<real<<","<<imag<<")"<<endl;
    21 
    22 }
    23 Complex Complex::operator + (Complex c1)
    24 {
    25     Complex tmp;
    26     tmp.real = real + c1.real;
    27     tmp.imag = imag + c1.imag;
    28     return tmp;
    29 }
    30 Complex Complex::operator - (Complex c2)
    31 {
    32 Complex tmp;
    33     tmp.real = real - c2.real;
    34     tmp.imag = imag - c2.imag;
    35     return tmp;
    36 }
    37 
    38 int main()
    39 {
    40 Complex a(2.3,1.4);
    41 Complex b(1.5,1.7);
    42 Complex c = a+b;
    43 Complex d = a-b;
    44 c.display();
    45 d.display();
    46 }
    结果:

    (3.8,3.1)
    (0.8,-0.3)

    单目运算符重载实例:

     1 #include<iostream>
     2 using namespace std;
     3 class Clock
     4 {
     5     private:
     6     int hour;
     7     int minute;
     8     int second;
     9     public:
    10     Clock(int newh,int newm,int news):hour(newh),minute(newm),second(news)
    11     {
    12     }
    13     Clock &operator ++();
    14     Clock operator ++(int);
    15     void showtime()
    16     {
    17         cout<<hour<<":"<<minute<<":"<<second<<endl;
    18     }
    19 };
    20 Clock &Clock::operator++()
    21 {
    22     second++;
    23     if(second == 60)
    24     {
    25     second =0;
    26     minute++;
    27     }
    28     if(minute ==60)
    29     {
    30     minute = 0;
    31     hour++;
    32     }
    33     if(hour==24)
    34     hour =0;    
    35     return *this;
    36 }
    37 Clock Clock::operator++(int)
    38 {
    39 Clock old = *this;
    40 ++*this;
    41 return old;
    42 }
    43 int main()
    44 {
    45 Clock c1(23,59,59);
    46 c1.showtime();
    47 ++c1;
    48 c1.showtime();
    49 (c1++).showtime();
    50 c1.showtime();
    51 }
    结果:

    23:59:59
    0:0:0
    0:0:0
    0:0:1

    友元运算符重载范例

    #include<iostream>
    using namespace std;
    class complex    //复数类声明
    {
    public:    //外部接口
        complex(double r=0.0,double i=0.0)        { real=r; imag=i; }    //构造函数
        friend complex operator + (complex c1,complex c2);    //运算符+重载为友元函数
        friend complex operator - (complex c1,complex c2);    //运算符-重载为友元函数
        void display();    //显示复数的值
    private:    //私有数据成员
        double real;
        double imag;
    };        
    void complex::display()
    {
         cout<<"("<<real<<","<<imag<<")"<<endl;
    }    
    complex operator +(complex c1,complex c2)//运算符重载友元函数实现
    {      return     complex(c2.real+c1.real, c2.imag+c1.imag);
    }
    complex operator -(complex c1,complex c2)    //运算符重载友元函数实现
    {    return       complex(c1.real-c2.real, c1.imag-c2.imag);
    }
        int main()
     {
         complex a(2.3,1.4);
       complex b(1.5,1.7);
       complex c = a+b;
       complex d = a-b;
       c.display();
       d.display();
     }
  • 相关阅读:
    final发布用户使用报告
    PSP总结报告
    每周例行报告
    王者荣耀交流协会final发布-第3次scrum立会
    每周例行报告
    王者荣耀交流协会互评Beta版本--爱阅app
    Beta发布用户使用报告
    每周例行报告
    Beta冲刺第二周王者荣耀交流协会第六次会议
    每周例行报告
  • 原文地址:https://www.cnblogs.com/defen/p/5345036.html
Copyright © 2011-2022 走看看