C++语言之Note-Polymorphism-01
小标 2018-07-10 来源 : 阅读 564 评论 0

摘要:本文主要向大家介绍了C++语言之Note-Polymorphism-01,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言之Note-Polymorphism-01,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

一、运算符重载的规则

1、C++几乎可以重载全部的运算符,而且只能够重载C++中已经有的

不能重载的运算符:" . " " .* " " :: " " ?: "

2、重载之后运算符的优先级和结合性都不会改变

3、运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造

Ex:使复数类的对象可以用"+"运算符实现加法

使时钟类对象可以用"++"运算符实现增加1秒

4、重载可以为类的非静态成员函数,也可以重载为非成员函数

二、双目运算符重载为成员函数

1、重载为类成员的运算符函数定义形式:

函数类型 operator 运算符(形参)

{

...

}

参数个数=原操作数个数-1(后置++、--除外)

2、双目运算符重载规则

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

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

Ex:复数类加减法运算发重载为成员函数

(1)要求:将+、-运算符重载为复数类的成员函数

(2)规则:实部、虚部分别想加减

(3)操作数:两个操作数都是复数类的对象

(4)Code:

#include <iostream>
using namespace std;
class Complex {
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { }
    //运算符+重载成员函数
    Complex operator + (const Complex &c2) const;
    //运算符-重载成员函数
    Complex operator - (const Complex &c2) const;
    void display() const;   //输出复数
private:
    double real;    //复数实部
    double imag;    //复数虚部
};
 
Complex Complex::operator+(const Complex &c2) const{
    //创建一个临时无名对象作为返回值
    return Complex(real + c2.real, imag + c2.imag);
}
 
Complex Complex::operator-(const Complex &c2) const{
    //创建一个临时无名对象作为返回值
    return Complex(real - c2.real, imag - c2.imag);
}
 
void Complex::display() const {
    cout << "(" << real << ", " << imag << ")" << endl;
}
 
int main() {
    Complex c1(5, 4), c2(2, 10), c3;
    cout << "c1 = "; c1.display();
    cout << "c2 = "; c2.display();
    c3 = c1 - c2;   //使用重载运算符完成复数减法
    cout << "c3 = c1 - c2 = "; c3.display();
    c3 = c1 + c2;   //使用重载运算符完成复数加法
    cout << "c3 = c1 + c2 = "; c3.display();
    return 0;
}</iostream>

 

三、单目运算符重载为成员函数

 

1、前置单目运算符重载规则

(1)如果要重载U为类成员函数,使之能够实现表达式U oprd,其中oprd为A类对象,则U应被重载为A类的成员函数,无形参

(2)经重载后表达式U oprd相当于oprd.operator U()

2、后置单目运算符++和--重载规则

(1)如果要重载++或--为类成员函数,使之能够实现表达式oprd++或oprd--,其中oprd为A类对象,则++或--应被重载为A类的成员函数,且具有一个int类型的形参。

(2)经重载后,表达式oprd++相当于oprd.operator++(0)

Ex:重载前置++和后置++为时钟类成员函数

(1)前置单目运算符,重载函数没有形参

(2)后置++运算符,重载函数需要有一个int型形参

(3)操作数是时钟类的对象

(4)实现时间增加1秒钟

Code:

#include <iostream>
using namespace std;
class Clock {//时钟类定义
public:
    Clock(int hour = 0, int minute = 0, int second = 0);
    void showTime() const;
    //前置单目运算符重载
    Clock& operator ++ ();
    //后置单目运算符重载
    Clock operator ++ (int);
private:
    int hour, minute, second;
};
 
Clock::Clock(int hour, int minute, int second) {
    if (0 <= hour && hour < 24 && 0 <= minute && minute < 60
        && 0 <= second && second < 60) {
        this->hour = hour;
        this->minute = minute;
        this->second = second;
    }
    else
        cout << "Time error!" << endl;
}
void Clock::showTime() const {  //显示时间
    cout << hour << ":" << minute << ":" << second << endl;
}
 
Clock & Clock::operator ++ () {
    second++;
    if (second >= 60) {
        second -= 60;  minute++;
        if (minute >= 60) {
            minute -= 60; hour = (hour + 1) % 24;
        }
    }
    return *this;
}
 
Clock Clock::operator ++ (int) {
    //注意形参表中的整型参数
    Clock old = *this;
    ++(*this);  //调用前置“++”运算符
    return old;
}
 
int main() {
    Clock myClock(23, 59, 59);
    cout << "First time output: ";
    myClock.showTime();
    cout << "Show myClock++:    ";
    (myClock++).showTime();
    cout << "Show ++myClock:    ";
    (++myClock).showTime();
    return 0;
}</iostream>

   

 

 

四、运算符重载为非成员函数

 

1、运算符重载为非成员函数的规则

(1)函数的形参代表依次自左至右依次排列的各操作数

(2)重载为非成员函数时

参数个数=原操作数个数(后置++、--除外)

至少应该有一个自定义类型的参数

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

(4)如果在运算符的重载函数中需要操作某类对象的私有成员可以将此函数声明为该类的友元。

2、运算符重载为非成员函数的规则

(1)双目运算符 B重载后,

表达式oprd1 B oprd2

等同于operator B(oprd1,oprd2 )

(2)前置单目运算符 B重载后,

表达式 B oprd

等同于operator B(oprd )

(3)后置单目运算符 ++和--重载后,

表达式 oprd B

等同于operator B(oprd,0 )

 

Ex: 将+、-(双目)重载为非成员函数,并将其声明为复数类的友元,两个操作数都是复数类的常引用。 ? 将<<(双目)重载为非成员函数,并将其声明为复数类的友元,它的左操作数是std::ostream引用,右操作数为复数类的常引用,返回std::ostream引用,用以支持下面形式的输出:

   

<code>cout << a << b;
</code>
   
该输出调用的是:
<code><code>operator << (operator << (cout, a), b);</code></code>
    
<code><code>#include <iostream>
using namespace std;
 
class Complex {
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { }
    friend Complex operator+(const Complex &c1, const Complex &c2);
    friend Complex operator-(const Complex &c1, const Complex &c2);
    friend ostream & operator<<(ostream &out, const Complex &c);
private:
    double real;  //复数实部
    double imag;  //复数虚部
};
 
Complex operator+(const Complex &c1, const Complex &c2){
    return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
Complex operator-(const Complex &c1, const Complex &c2){
    return Complex(c1.real - c2.real, c1.imag - c2.imag);
}
 
ostream & operator<<(ostream &out, const Complex &c){
    out << "(" << c.real << ", " << c.imag << ")";
    return out;
}
 
int main() {
    Complex c1(5, 4), c2(2, 10), c3;
    cout << "c1 = " << c1 << endl;
    cout << "c2 = " << c2 << endl;
    c3 = c1 - c2;   //使用重载运算符完成复数减法
    cout << "c3 = c1 - c2 = " << c3 << endl;
    c3 = c1 + c2;   //使用重载运算符完成复数加法
    cout << "c3 = c1 + c2 = " << c3 << endl;
    return 0;
}</iostream></code></code>

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程