C++之------运算符重载

①  什么是运算符重载?



何为C++的运算符重载呢?

其实就是运算符给它重新赋予新的含义或者多重含义。让它有另外一种新的功能。

为什么需要运算符重载?

面向对象中为了实现类的多态性,我们就引用了运算符重载

程序中可以利用“+”、“—” 对整数、单精度、双精度以及指针进行加法和减法运算等

例如:

1 int a = 1+2; //对整数加
2 double d = 1.0+2.54; //对双精度加
3 int por[10];
4 int *p = por;
5 p = p- 1; //对指针减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对象的加,

 

比喻下面的例子

 1 int main(){
 2     Complex a(10, 7), b(3, 5);
 3     Complex c= a + b;
 4     Complex d = a - b;
 5     Complex e = a + b - d;
 6     cout << "c="; c.print_complex();
 7     cout << "d="; d.print_complex();
 8     cout << "e="; e.print_complex();
 9     int x=100, y=200, z;
10     z = x + y;
11     cout <<  "z=" << z;
12 }

使用成员函数来重载Complex的+、-运算符操作

 1 #include <iostream>
 2 using namespace std;
 3 class Complex {
 4 private:
 5     double rpart, ipart;
 6 public:
 7     Complex ( ) { rpart=ipart=0.0; }
 8     Complex(double rp, double ip){
 9         rpart=rp; ipart=ip;
10     }
11     Complex operator +(const Complex &c){
12         Complex temp(rpart+c.rpart, ipart+c.ipart);
13         return temp;
14     }
15
16     Complex operator -(const Complex &c);
17     void print_complex()
18     {
19         cout<< "(" << rpart<<‘,‘<<ipart << "i)" <<endl;
20     }
21 };
22 //类外实现operator –函数
23 Complex Complex::operator -(const Complex &c){
24     Complex temp(rpart-c.rpart, ipart-c.ipart);
25     return temp;
26 }

运行结果:

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群:  
时间: 2024-12-04 15:56:21

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

关于运算符重载

运算符重载需遵循以下原则: 1.除了类所属关系运算符".".成员指针运算符".*".作用域运算符"::".sizeof运算符.三目运算符"?:"之外,C++中所有的运算符都可以进行重载 2.重载运算符限制在C++已有的运算符范围内,不允许创建新的运算符 3.重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符的操作数的个数及语法结构 4.运算符重载不能改变运算符用于内置类型的对象的含义,只能用于自定义类型对象之间,

运算符重载

关键字:operator 相见:<高质量程序设计指南> P255 如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符. 如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数. 运算符重载的特殊性 如果重载为成员函数,则this对象发起对它的调用 如果重载为全局函数,则第一个参数发起对它的调用 禁止用户发明该语言运算符集合中不存在的运算符 除了函数调用运算符

C++ 运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.比如对象a和对象b, 那么 a+b 就需要用户自己定义它怎么相加,这时就用到了运算符重载. 运算符重载规则如下: ①. C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符. ②. 重载之后运算符的优先级和结合性都不会改变. ③. 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造.一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对

Kotlin中复合赋值(+=,-=,……)运算符重载

本篇建立在已经了解了kotlin中运算符重载的理念以及如何实现的基础上. 来我们首先写一个简单的类,然后重载运算符+,+=,-,-=这个几个运算符.代码如下: data class Point(var x: Int, var y: Int) { operator fun plus(point: Point): Point { return Point(this.x + point.x, this.y + point.y) } operator fun plusAssign(point: Poin

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

C++运算符重载的妙用

运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,operator>>支持cin,cout输入输出.重载operator[],实现下标运算.重载operator+=实现元素追加:重载operator()实现函数调用.假设你对C++的运算符重载掌握的游刃有余.那就无需继续往下看了. 运算符重载带来的优点就是--让代码变得简洁.以下将展示几个标准库因使

网易云课堂_C++开发入门到精通_章节4:运算符重载

课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == &other) { return *this; } //释放原有的内存资源 delete[]m_data; int length = strlen(other.m_data); m_data = new char[length + 1]; strcpy(m_data, other.m_data);

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

C++:运算符重载函数之&quot;++&quot;、&quot;--&quot;、&quot;[ ]&quot;的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };