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

简介:   上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题。++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又是完全不同的(q前置运算符:先加1,再赋值;后置运算符:先赋值,再加1)。

  上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题。++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又是完全不同的(q前置运算符:先加1,再赋值;后置运算符:先赋值,再加1)。那么要怎么重载它们,才可以有效的区分开来呢?今天我就来说说C++中是怎么处理前置运算符和后置运算符的重载的。以及介绍一下插入运算符(>>)和提取运算符(<<)的重载。

  1.在C++里编译器是根据运算符重载函数参数表里是否插入关键字int来区分前置还是后置运算。比如:

#include "stdafx.h"
#include <iostream>

class TDPoint//三维坐标
{
private:
int x;
int y;
int z;
public:
        TDPoint(int x=0,int y=0,int z=0)
        {
this->x=x;
this->y=y;
this->z=z;
        }
        TDPoint operator++();//成员函数重载前置运算符++
        TDPoint operator++(int);//成员函数重载后置运算符++
        friend TDPoint operator++(TDPoint& point);//友元函数重载前置运算符++
        friend TDPoint operator++(TDPoint& point,int);//友元函数重载后置运算符++
void showPoint();
};

TDPoint TDPoint::operator++()
{
++this->x;
++this->y;
++this->z;
return*this;//返回自增后的对象
}

TDPoint TDPoint::operator++(int)
{
    TDPoint point(*this);
this->x++;
this->y++;
this->z++;
return point;//返回自增前的对象
}

TDPoint operator++(TDPoint& point)
{
++point.x;
++point.y;
++point.z;
return point;//返回自增后的对象
}

TDPoint operator++(TDPoint& point,int)
{
    TDPoint point1(point);
    point.x++;
    point.y++;
    point.z++;
return point1;//返回自增前的对象
}

void TDPoint::showPoint()
{
    std::cout<<"("<<x<<","<<y<<","<<z<<")"<<std::endl;
}

int main()
{
    TDPoint point(1,1,1);
    point.operator++();//或++point
    point.showPoint();//前置++运算结果

    point=point.operator++(0);//或point=point++
    point.showPoint();//后置++运算结果

operator++(point);//或++point;
    point.showPoint();//前置++运算结果

    point=operator++(point,0);//或point=point++;
    point.showPoint();//后置++运算结果

return0;
}

结果:

从示例代码里可以清楚的看出,后置运算符重载函数比前置运算符重载函数多了一个int类型的参数,这个参数只是为了区别前置和后置运算符,此外没有任何作用。所以在调用后置运算符重载函数时,int类型的实参可以取任意值。

  2.在C++中,操作符"<<"和">>"被定义为左位移运算符和右位移运算符。由于在iostream头文件中对它们进行了重载,使得它们可以用基本数据的输出和输入。

#include "stdafx.h"
#include <iostream>

int main()
{
    int a=10;
    std::cout<<"a="<<a<<std::endl;//运算符"<<"重载后用于输出
    a=a>>2;//右移运算符
    std::cout<<"右移2位:a="<<a<<std::endl;

    std::cout<<"请输入一个整数a:";
    std::cin>>a;//运算符">>"重载后用于输入
    a=a<<2;//左移运算符
    std::cout<<"左移2位:a="<<a<<std::endl;

    return0;
}

结果:

插入运算符"<<"是双目运算符,左操作数为输出流类ostream的对象,右操作数为系统预定义的基本类型数据。头文件iostrem对其重载的函数原型为ostream& operator<<(ostream& ,类型名);类型名就是指基本类型数据。但如果要输出用户自定义的类型数据的话,就需要重载操作符"<<",因为该操作符的左操作数一定为ostream类的对象,所以插入运算符"<<"只能是类的友元函数或普通函数,不能是其他类的成员函数。一般定义格式:

  ostream& operator<<(ostream& ,自定义类名&);

提取运算符">>"也是如此,左操作数为istream类的对象,右操作数为基本类型数据。头文件iostrem对其重载的函数原型为istream& operator>>(istream& ,类型名);提取运算符也不能作为其他类的成员函数,可以是友元函数或普通函数。它的一般定义格式为:

  istream& operator>>(istream& ,自定义类名&);

我还是用上一节用的Complex类(复数类)来举例:

#include "stdafx.h"
#include <iostream>

class Complex //复数类
{
    private://私有
double real;//实数
double imag;//虚数
public:
        Complex(double real=0,double imag=0)
        {
            this->real=real;
            this->imag=imag;
        }
        friend std::ostream&operator<<(std::ostream& o,Complex& com);//友元函数重载提取运算符"<<"
        friend std::istream&operator>>(std::istream& i,Complex& com);//友元函数重载插入运算符">>"
};

std::ostream&operator<<(std::ostream& o,Complex& com)
{
    std::cout<<"输入的复数:";
    o<<com.real;
    if(com.imag>0)
        o<<"+";
    if(com.imag!=0)
        o<<com.imag<<"i"<<std::endl;
    return o;
}

std::istream&operator>>(std::istream& i,Complex& com)
{
    std::cout<<"请输入一个复数:"<<std::endl;
    std::cout<<"real(实数):";
    i>>com.real;
    std::cout<<"imag(虚数):";
    i>>com.imag;
    return i;
}

int main()
{

    Complex com;
    std::cin>>com;
    std::cout<<com;

    return0;
}

结果:

相关文章
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
192 1
|
程序员 编译器 C++
C++中的运算符重载(Operator Overloading)
C++中的运算符重载(Operator Overloading)
289 1
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
411 5
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
309 1
|
存储 编译器 C++
【C++】:拷贝构造函数和赋值运算符重载
【C++】:拷贝构造函数和赋值运算符重载
260 1
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
228 2
|
程序员 C++
C++程序中的运算符重载
C++程序中的运算符重载
128 2
|
编译器 C++
C++|运算符重载(1)|为什么要进行运算符重载
C++|运算符重载(1)|为什么要进行运算符重载
|
编译器 C语言 C++
【C++从练气到飞升】05---运算符重载(二)
【C++从练气到飞升】05---运算符重载(二)
180 5