上一节主要讲解了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++();//或++pointpoint.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++之运算符重载(2)相关推荐

  1. c++重载(以运算符重载为主)

    重载(OverLoading)是面向对象程序设计多态性的一种体现.所谓重载,是指"同一标识符"在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符.也就是说,重载可 ...

  2. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  3. c++运算符重载总结

    c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...

  4. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  5. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

  6. C++中运算符重载需要遵循的规则

    一.C++中运算符重载需要遵循的规则 1.并不是所有的运算符都可以重载.能够重载的运算符包括: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^ ...

  7. C++中的运算符重载基础

    1.C++中的运算符重载基础 所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Ov ...

  8. C++中的运算符重载

    1.Cpp中的重载运算符和重载函数 C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但 ...

  9. C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

    C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别 C++构造函数用=与()不完全一样,注意使用=时c++中临时变量不能作为非const的引用参数,不论是=运算符重载还是构造函数,否则可能出现以下错 ...

  10. C++——运算符重载operator

    C++--运算符重载operator C++ prime plus第11章,运算符重载是C++的一种多态.运算符重载格式如下: operator运算符(argument-list) 1.做普通函数重载 ...

最新文章

  1. mysql --initalize_MySQL初始化设置
  2. java 平滑升级_服务器spring boot版本,平滑升级
  3. 高效的序列化/反序列化数据方式 Protobuf
  4. Python3.0 新特性
  5. 用最科学的方法展示最形象的图表——前段数据可视化选型实践
  6. gentoo实体机安装显卡驱动和解决多媒体播放问题
  7. 借条已经收回,他以没收据为由让我继续还款怎样办?
  8. sqli-labs Less-11 and Less-12
  9. Sass学习笔记 -- 混合器
  10. java语言的基本介绍及相关特性
  11. 网吧无盘服务器进u盘启动,利用U盘启动在网吧免费上网
  12. xh2.54母头转换为杜邦线母头
  13. rocketmq 消费方式_详解RocketMQ中的Consumer
  14. 造数神器mocker带你10分钟完成千万级别数据量的造数能力-高级用法篇
  15. animate.css的使用
  16. php通过imap获取腾讯企业邮箱信息后的解码处理
  17. Pokeman.csv 处理(Python)
  18. 无人机飞控技术最详细解读
  19. 史上最全体检表、检验报告解析
  20. 北斗校时系统(GPS授时设备)几种时间同步方法

热门文章

  1. LYVC揭秘硅谷核心基金圈投资游戏规则
  2. 使用Ubuntu笔记
  3. PHP Fatal error: Class #39;DOMDocument#39; not found
  4. php文件上传参数设置
  5. 浏览器显示XML文档
  6. 微软Windows Azure Platform技术解析
  7. 内网之工作组、域 分析
  8. OpenCV 升降维度
  9. 树莓派3b python3.6.1 SSL模块调用不起来的坑
  10. 模板 - 图论 - 树链剖分