Part8 多态性 8.1运算符重载

1运算符重载的规则
C++ 几乎可以重载全部的运算符,而且只能够重载C++中已经有的。
不能重载的运算符:“.”、“.*”、“::”、“?:”
重载之后运算符的优先级和结合性都不会改变。

重载的两种形式:
  1 重载为类的非静态成员函数;
  2 重载为非成员函数。



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

函数类型 operator 运算符(形参)
{
......
}
参数个数=原操作数个数-1 (后置++、--除外)

双目运算符重载规则:
  如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数,
  形参类型应该是 oprd2 所属的类型。
  经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)

//例8-1复数类加减法运算重载为成员函数
#include<iostream>
using namespace std;
class Complex{
public:
    Complex(double r = 0.0, double i = 0.0):real(r), image(i){}
    Complex operator +(const Complex &c2) const;
    Complex operator -(const Complex &c2) const;
    void display() const;
private:
    double real;
    double image;
};
Complex Complex::operator+(const Complex &c2) const{
    return Complex(real+c2.real, image+c2.image);//创建一个临时无名对象作为返回值
}
Complex Complex::operator-(const Complex &c2) const{
    return Complex(real-c2.real, image-c2.image);
}
void Complex::display() const{
    cout << "(" << real << ", " << image << ")" << 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;
}


3单目运算符重载为成员函数
前置单目运算符重载规则:
  如果要重载 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数,无形参。
  经重载后,表达式 U oprd 相当于 oprd.operator U()
后置单目运算符 ++和--重载规则:
  如果要重载 ++或--为类成员函数,使之能够实现表达式 oprd++ 或 oprd-- ,其中 oprd 为A类对象,则 ++或-- 应被重载为 A 类的成员函数,且具有一个 int 类型形参。
  经重载后,表达式 oprd++ 相当于 oprd.operator ++(0)

//例8-2重载前置++和后置++为时钟类成员函数
#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;
}


4运算符重载为非成员函数
运算符重载为非成员函数的规则:
  函数的形参代表依自左至右次序排列的各操作数。
  参数个数=原操作数个数(后置++、--除外)
  至少应该有一个自定义类型的参数。
  如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元。

双目运算符 B重载后,
  表达式oprd1 B oprd2
  等同于operator B(oprd1,oprd2)
前置单目运算符 B重载后,
  表达式 B oprd
  等同于operator B(oprd )
后置单目运算符 ++和--重载后,
  表达式 oprd B
  等同于operator B(oprd,0)

//例8-3 重载Complex的加减法和“<<”运算符为非成员函数
#include<iostream>
using namespace std;
class Complex{
public:
    Complex(double r = 0.0, double i = 0.0):real(r), image(i){}
    friend Complex operator+(const Complex &c1, const Complex &c2);
    friend Complex operator-(const Complex &c1, const Complex &c2);
    //它的左操作数是std::ostream引用,右操作数为复数类的常引用,返回std::ostream引用
    friend ostream &operator<<(ostream &out, const Complex &c);
private:
    double real;
    double image;
};

Complex operator+(const Complex &c1, const Complex &c2){
    return Complex(c1.real+c2.real, c1.image+c2.image);
}
Complex operator-(const Complex &c1, const Complex &c2){
    return Complex(c1.real-c2.real, c1.image-c2.image);
}
ostream &operator<<(ostream &out, const Complex &c){
    out << "(" << c.real << ", " << c.image << ")";
    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;
}
时间: 2024-10-08 23:25:34

Part8 多态性 8.1运算符重载的相关文章

6、多态性-2、运算符重载

1.c++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型(如类),也需要有类似的运算操作.例如,下面的程序段定义了一个复数类: class complex { public: complex(double r=0.0,double i=0.0){real=r;imag=i;} void display(); private: double real; double imag; }; 于是我们可以这样声明复数类的对象:complex a(10,20),b(5,8);

多态性——运算符重载

多态性--运算符重载 "C++中预定义的运算符的操作对象只能是基本数据类型." "运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型时导致不同的行为." "运算符重载的实质就是函数重载." 根据上述教材中给出的对运算符的重载的相关解释,我们可以初步了解到运算符的重载的原理和作用,在这篇博客中我们会进一步用实验去实现运算符重载的原理和作用. 1.运算符重载实现 在这开始,定义了一个类Point,面向的对象是二维坐标轴中的点,在现实

C++之------运算符重载

①  什么是运算符重载? 何为C++的运算符重载呢? 其实就是运算符给它重新赋予新的含义或者多重含义.让它有另外一种新的功能. 为什么需要运算符重载? 面向对象中为了实现类的多态性,我们就引用了运算符重载 程序中可以利用“+”.“—” 对整数.单精度.双精度以及指针进行加法和减法运算等 例如: 1 int a = 1+2; //对整数加 2 double d = 1.0+2.54; //对双精度加 3 int por[10]; 4 int *p = por; 5 p = p- 1; //对指针减

[转]C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 1 int i;2 int i1=10,i2=10;3 i=i1+i2;4 std::co

C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 int i; int i1=10,i2=10; i=i1+i2; std::cout<<

【C++知识汇总】运营商 &amp;amp; 运算符重载

[运算符] 在进行运算时,假设右括号的话我们知道先运算哪个,那假设没有括号了.算术运算符,关系运算符,逻辑运算符,位运算符.赋值运算符,++.--运算符等等,那么多的运算符.我们先算哪边.也就是这些运算符的优先级怎么排序呢? 优先级 操作符 描写叙述 样例 结合性 1 () [] -> . :: ++ -- 调节优先级的括号操作符 数组下标訪问操作符 通过指向对象的指针訪问成员的操作符 通过对象本身訪问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 (a + b) / 4; arra

C#高级编程四十天----运算符重载

运算符重载 所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力. 例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和. int i=5,j=4; int sum = i+j; 如果可以使用代表附属的用户定义的类型来编写相同类型的表达式,那当然是最好不过的了: Complex i=5; Complex sum=i+j; 运算符重载允许为用户定义的类型重载(即指明明确的含义)诸如"+"这样的运算符.如果不进行重载,则用户需要编写以下代码: C

12--C++_运算符重载

C++_运算符重载 什么是运算符的重载? 运算符与类结合,产生新的含义. 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义) 怎么实现运算符的重载? 方式:类的成员函数 或 友元函数(类外的普通函数) 规则:不能重载的运算符有.  和 .* 和 ?: 和 ::  和 sizeof 和 typeid 友元函数和成员函数的使用场合: 一般情况下,建议一元运算符使用成员函数,二元运算符使用友元函数 1.运算符的操作需要修改类对象的状态,则使用成员函数.如需要做左值操作数

【C++知识点总结】运算符 &amp; 运算符重载

[运算符] 在进行运算时,如果右括号的话我们知道先运算哪个,那如果没有括号了,算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,++.--运算符等等,那么多的运算符,我们先算哪边,也就是这些运算符的优先级怎么排序呢? 优先级 操作符 描述 例子 结合性 1 () [] -> . :: ++ -- 调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 通过对象本身访问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 (a + b) / 4; array[