c++运算符重载2
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++运算符重载2,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3886字,纯文字阅读大概需要6分钟。
内容图文
上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题。++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又是完全不同的(q前置运算符:先加1,再赋值;后置运算符:先赋值,再加1)。那么要怎么重载它们,才可以有效的区分开来呢?今天我就来说说C++中是怎么处理前置运算符和后置运算符的重载的。以及介绍一下插入运算符(>>)和提取运算符(<<)的重载。1.在C++里编译器是根据运算符重载函数参数表里是否插入关键字int来区分前置还是后置运算。比如:
1#include "stdafx.h" 2#include <iostream> 3 4class TDPoint//三维坐标 5{ 6private: 7int x; 8int y; 9int z; 10public: 11 TDPoint(int x=0,int y=0,int z=0) 12 { 13this->x=x; 14this->y=y; 15this->z=z; 16 } 17 TDPoint operator++();//成员函数重载前置运算符++18 TDPoint operator++(int);//成员函数重载后置运算符++19 friend TDPoint operator++(TDPoint& point);//友元函数重载前置运算符++20 friend TDPoint operator++(TDPoint& point,int);//友元函数重载后置运算符++21void showPoint(); 22}; 2324TDPoint TDPoint::operator++() 25{ 26++this->x; 27++this->y; 28++this->z; 29return*this;//返回自增后的对象30} 3132TDPoint TDPoint::operator++(int) 33{ 34 TDPoint point(*this); 35this->x++; 36this->y++; 37this->z++; 38return point;//返回自增前的对象39} 4041TDPoint operator++(TDPoint& point) 42{ 43++point.x; 44++point.y; 45++point.z; 46return point;//返回自增后的对象47} 4849TDPoint operator++(TDPoint& point,int) 50{ 51 TDPoint point1(point); 52 point.x++; 53 point.y++; 54 point.z++; 55return point1;//返回自增前的对象56} 5758void TDPoint::showPoint() 59{ 60 std::cout<<"("<<x<<","<<y<<","<<z<<")"<<std::endl; 61} 6263int main() 64{ 65 TDPoint point(1,1,1); 66 point.operator++();//或++point67 point.showPoint();//前置++运算结果6869 point=point.operator++(0);//或point=point++70 point.showPoint();//后置++运算结果7172operator++(point);//或++point;73 point.showPoint();//前置++运算结果7475 point=operator++(point,0);//或point=point++;76 point.showPoint();//后置++运算结果7778return0; 79}
结果:
从示例代码里可以清楚的看出,后置运算符重载函数比前置运算符重载函数多了一个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; }
结果:
原文:http://blog.csdn.net/jiangheng0535/article/details/42007743
内容总结
以上是互联网集市为您收集整理的c++运算符重载2全部内容,希望文章能够帮你解决c++运算符重载2所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。