C++之------运算符重载
① 什么是运算符重载?
何为C++的运算符重载呢?
其实就是运算符给它重新赋予新的含义或者多重含义。让它有另外一种新的功能。
为什么需要运算符重载?
面向对象中为了实现类的多态性,我们就引用了运算符重载
程序中可以利用“+”、“—” 对整数、单精度、双精度以及指针进行加法和减法运算等
例如:
- int a = +; //对整数加
- double d = 1.0+2.54; //对双精度加
- int por[];
- int *p = por;
- p = p- ; //对指针减1
②运算符重载由来
在计算机的内存中,整数与浮点数的存储形式是不一样的,计算机他们的加减运算的处理过程是不同的,
而且指针-1并不是简单的地址-1而已。在C++里面,编译器来处理这些问题,它可以根据表达式两侧的类型来决
定应该如何处理他们的运算,最后决定该执行什么操作。所以在C++中可以对运算符可以对不同类型进行运算操作。
现实中的问题:复数的运算-------
可能很多童鞋忘了什么是复数.咋们先来说说什么是复数(光谷的学到老活到老)
复数是指能写成如下形式的数a+bi,这里a和b是实数,i是虚数单位。在复数a+bi中,a称为复数的实部,b称
为复数的虚部,i称为虚数单位。当虚部等于零时,这个复数就是实数;当虚部不等于零时,这个复数称为虚数,复数的
实部如果等于零,则称为纯虚数。由上可知,复数集包含了实数集,并且是实数集的扩张。 复数是由意大利米兰学者
卡当在十六世纪首次引入,经过达朗贝尔、棣莫弗、欧拉、高斯等人的工作,此概念逐渐为数学家所接受。(来自:百度百科)
好,来正题:
比如两个复数:S1=(1+2i) S2=(6+1.2i)
我们在数学里面进行两个复数相加S=S1+S2=(7+3.2i) (实部与实部相加,虚部与虚部相加)
在C++里面我们如何计算呢 ?
所有我们需要用到运算符的重载。
③ 程序中运算符重载格式
重载的运算符函数语法为:
重载运算符的函数一般格式如下:
<返回值类型># operator 运算符名称 (形参表列)
{
//
对运算符的重载处理
}
operator为关键字,专门用于定义重载的运算符函数,#代表要被重载的运算符。如:
Complex operator + (const Complex& a, const Complex& b){ ...... } 该函数可以用来是是实现对两个Complex对象的加,
比喻下面的例子
- int main(){
- Complex a(, ), b(, );
- Complex c= a + b;
- Complex d = a - b;
- Complex e = a + b - d;
- cout << "c="; c.print_complex();
- cout << "d="; d.print_complex();
- cout << "e="; e.print_complex();
- int x=, y=, z;
- z = x + y;
- cout << "z=" << z;
- }
使用成员函数来重载Complex的+、-运算符操作
- #include <iostream>
- using namespace std;
- class Complex {
- private:
- double rpart, ipart;
- public:
- Complex ( ) { rpart=ipart=0.0; }
- Complex(double rp, double ip){
- rpart=rp; ipart=ip;
- }
- Complex operator +(const Complex &c){
- Complex temp(rpart+c.rpart, ipart+c.ipart);
- return temp;
- }
- Complex operator -(const Complex &c);
- void print_complex()
- {
- cout<< "(" << rpart<<','<<ipart << "i)" <<endl;
- }
- };
- //类外实现operator –函数
- Complex Complex::operator -(const Complex &c){
- Complex temp(rpart-c.rpart, ipart-c.ipart);
- return temp;
- }
运行结果:
C++编译器的处理为(a.operator +(b)).operator –(d)
③哪些运算符可以重载?
运算符的重载有哪些呢?
可以被重载的运算符
单目运算符 |
+(正)、-(负)、*(指针)、&(取地址) |
双目算术运算符 |
+(加)、-(减)、*(乘)、/(除)、%(取摸) |
自增自减运算符 |
++(自增)、--(自减) |
逻辑运算符 |
||(逻辑或)、&&(逻辑与)、!(逻辑非) |
关系运算符 |
= =(等于)、!=(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于) |
位运算符 |
|(按位或)、&(按位与)、~(按位取反)、^(按位异或)、<<(左移)、>>(右移) |
赋值运算符 |
=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>= |
内存申请与释放 |
new、delete[]、new[]、delete[] |
其他运算符 | ()(函数调用)、->(成员访问)、->*(成员指针访问)、,(逗号)、[](下标) |
类成员访问运算符:->
看看网上的一个例子:
- 1 #include <iostream>
- 2 using namespace std;
- 3 class A{
- 4 public:
- 5 A(double v){
- 6 value = v;
- 7 }
- 8 print(){
- 9 cout << value;
- 10 }
- 11 private:
- 12 double value;
- 13 };
- 14 class A_Ptr{
- 15 public:
- 16 A_Ptr(A* p){
- 17 pa = p;
- 18 }
- 19 A* operator ->(){
- 20 return pa;
- 21 }
- 22 private:
- 23 A* pa;
- 24 };
这里我们直接编译器测试输出结果:
理解: A_Ptr类封装了类A对象,语句“aptr->print();”中的“aptr->”部分,编译器调用“A *aptr.operator ->();”,
返回一个指向类A的对象的指针。然后调用该指针所指向对象的print函数。即调用过程为: (aptr.operator ->())->print();
END!
马上快过中秋节了,公司放了三天,没有妹纸,出去玩没意思,那就好好补下知识。
也提前祝大家中秋节快乐,幸福安康!
本人屌丝一个,没钱送月饼大家,送我一美女同事照片给大家养养眼。夏天酷热难耐,愿美女给大家带来一丝清凉感。




- 欢迎大家一起交流 ,分享程序员励志故事。 幸福的程序员 QQ群:
![]()
C++之------运算符重载的更多相关文章
- C++ 运算符重载时,将运算符两边对象交换问题.
在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- 标准C++之运算符重载和虚表指针
1 -> *运算符重载 //autoptr.cpp #include<iostream> #include<string> using namespace std ...
- python运算符重载
python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...
- PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天
PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数 1 构造 2 析构 3 赋值 4 拷贝构造 5 oper ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- 我的c++学习(8)运算符重载和友元
运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...
- c/c++面试题(6)运算符重载详解
1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
随机推荐
- POJ 3675 Telescope
题意:给定一个不自交的多边形,要求和圆心在原点的圆的面积交. 思路:同POJ2986,是加强版 代码: #include<algorithm> #include<cstdio> ...
- seajs教程之seajs学习笔记 seajs.use用法
seajs.use 用来在页面中加载模块.通过 use 方法,可以在页面中加载任意模块. 实例地址:http://www.android100.org/html/201405/23/12807.htm ...
- Hdu4005-The war(双连通缩点)
In the war, the intelligence about the enemy is very important. Now, our troop has mastered the situ ...
- Colorful Lecture Note(手工栈)
题目1 : Colorful Lecture Note 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi is writing an algorithm ...
- 虚函数virtual
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同 ...
- C++小知识之sprintf用法
sprintf 字串格式化命令,主要功能是把格式化的数据写入某个字符串中.sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf ...
- 修改UISearchBar输入框字体颜色
UITextField *searchField = [mySearchBar valueForKey:@"_searchField"]; searchField.textColo ...
- vps安全设置
适合新手及才接触VPS的朋友们看一下.主要是关于VPS安全方面相关内容的 禁止ROOT登陆 保证安全性. 使用DDoS deflate简单防攻击. iftop Linux流量监控工具: 每日自己主动备 ...
- [Hapi.js] Friendly error pages with extension events
hapi automatically responds with JSON for any error passed to a route's reply()method. But what if y ...
- hadoop备战:一台x86计算机搭建hadoop的全分布式集群
主要的软硬件配置: x86台式机,window7 64位系统 vb虚拟机(x86的台式机至少是4G内存,才干开3台虚机) centos6.4操作系统 hadoop-1.1.2.tar.gz jdk- ...