①  什么是运算符重载?


何为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!

马上快过中秋节了,公司放了三天,没有妹纸,出去玩没意思,那就好好补下知识。

也提前祝大家中秋节快乐,幸福安康!

本人屌丝一个,没钱送月饼大家,送我一美女同事照片给大家养养眼。夏天酷热难耐,愿美女给大家带来一丝清凉感。

  
 
        夏天炎热,不要湿身哦
 
 
 
 
 
 
     最近的一件新闻大家注意一下:一手游公司程序员,加班挂掉,才25岁。!!!
  还是那件事:程序员晚上要少撸代码多休息。所有健康很重要哦。今天还专门炖了一大电饭煲鸡蛋排骨汤吃来补身子。洗澡休息吧。
欢迎大家一起交流 ,分享程序员励志故事。   幸福的程序员 QQ群:  

C++之------运算符重载的更多相关文章

  1. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  2. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  3. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  4. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  5. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  6. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  7. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  8. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

  9. c/c++面试题(6)运算符重载详解

    1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...

  10. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

随机推荐

  1. [HDU] 2795 Billboard [线段树区间求最值]

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. 《Programming WPF》翻译 第9章 1.自定义控件基础

    原文:<Programming WPF>翻译 第9章 1.自定义控件基础 在写一个自定义控件之前,你需要问的第一个问题是,我真的需要一个自定义控件吗?一个写自定义控件的主要原因是为了用户界 ...

  3. 利用sql 存储过程把表中内容自动生成insert语句

    选中所在数据库 执行创建存储过程的sql CREATE proc [dbo].[spGenInsertSQL] (@tablename nvarchar(256),@sqlwhere varchar( ...

  4. vs2005中无法修改控件ID

    方法一:撤换到源代码模式下,通过代码更改id 方法二: 1.关闭VS2005: 2.删除目录 C:\Documents and Settings\Administrator\Local Setting ...

  5. Linux web性能优化

    1,

  6. 关于Tcp三次握手的思考

    一.为什么不能使两次握手,两次握手就应该可以保证线路的畅通? 1) 只能建立一个方向的连接,称为半连接 记住TCP是全双工的. A向B发出请求,同时收到B的确认,这时只有A.B知道A到B的连接成功了. ...

  7. 第六百二十一天 how can I 坚持

    好歹都是一些集成的框架,也懒得去深入研究了,微信小程序,今天体验了一个,虽然内心非常相信张小龙,但是还是不太看好,但是感觉确实需要一种方式去简化应用程序的开发,今天把没用的app都删了,太耽误时间了, ...

  8. Chosen 基本使用

    点击下载Chosen 引入文件 chosen.css jquery-1.7.1.min.js chosen.jquery.js 绑定数据: for (var i = 0; i < data.le ...

  9. 将string 转int

    /** * @param {string} str * @return {number} */ var myAtoi = function(str) { str = str.replace(/^(\s ...

  10. web前端之 CSS引入第三方插件

    引入第三方图标插件 - fontawesome 官网地址:http://fontawesome.io/ 1.下载图标插件包 下载地址:https://codeload.github.com/FortA ...