操作符重载的概念

复数计算第一种形式(自定义复数类):

 1 #include <stdio.h>
 2
 3 class Complex
 4 {
 5     int a;
 6     int b;
 7 public:
 8     Complex(int a = 0, int b = 0)
 9     {
10         this->a = a;
11         this->b = b;
12     }
13
14     int getA()
15     {
16         return a;
17     }
18
19     int getB()
20     {
21         return b;
22     }
23
24     friend Complex Add(const Complex& p1, const Complex& p2);
25 };
26
27 Complex Add(const Complex& p1, const Complex& p2)
28 {
29     Complex ret;
30
31     ret.a = p1.a + p2.a;
32     ret.b = p1.b + p2.b;
33
34     return ret;
35 }
36
37 int main()
38 {
39
40     Complex c1(1, 2);
41     Complex c2(3, 4);
42     Complex c3 = Add(c1, c2); // c1 + c2
43
44     printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
45
46     return 0;
47 }

Question:

Add 函数可以解决Complex对象相加的问题;

但是Complex是现实世界的确定存在的复数;

并且复数的地位在数学中的地位与普通的实数地位i相同;

为什么不能+操作符也支持复数相加呢?

操作符重载:

C++中的operator关键字可以定义特殊的函数

operator的本质是通过函数重载操作符;

 1 #include <stdio.h>
 2
 3 class Complex
 4 {
 5     int a;
 6     int b;
 7 public:
 8     Complex(int a = 0, int b = 0)
 9     {
10         this->a = a;
11         this->b = b;
12     }
13
14     int getA()
15     {
16         return a;
17     }
18
19     int getB()
20     {
21         return b;
22     }
23
24     friend Complex operator + (const Complex& p1, const Complex& p2);
25 };
26
27 Complex operator + (const Complex& p1, const Complex& p2)
28 {
29     Complex ret;
30
31     ret.a = p1.a + p2.a;
32     ret.b = p1.b + p2.b;
33
34     return ret;
35 }
36
37 int main()
38 {
39
40     Complex c1(1, 2);
41     Complex c2(3, 4);
42     Complex c3 = c1 + c2; // operator + (c1, c2)
43
44     printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
45
46     return 0;
47 }

操作符重载的本质就是函数重载.

那还有什么深度挖掘的地方呢?上面的例子我们使用了友元,而友元是我们尽量避免的,那我们可以怎样修改呢?

-可以将操作符重载函数定义为类中的  成员函数.

  -比全局操作符重载函数少一个参数(左操作数)

  -不需要依赖友元就可以完成操作符重载;

  -编译器优先在成员函数中寻找操作符操作函数;

实例代码分析3:

 1 #include <stdio.h>
 2
 3 class Complex
 4 {
 5     int a;
 6     int b;
 7 public:
 8     Complex(int a = 0, int b = 0)
 9     {
10         this->a = a;
11         this->b = b;
12     }
13
14     int getA()
15     {
16         return a;
17     }
18
19     int getB()
20     {
21         return b;
22     }
23
24     Complex operator + (const Complex& p)
25     {
26         Complex ret;
27         printf("Complex operator + (const Complex& p)\n");
28         ret.a = this->a + p.a;
29         ret.b = this->b + p.b;
30
31         return ret;
32     }
33
34     friend Complex operator + (const Complex& p1, const Complex& p2);
35 };
36
37 Complex operator + (const Complex& p1, const Complex& p2)
38 {
39     Complex ret;
40     printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
41     ret.a = p1.a + p2.a;
42     ret.b = p1.b + p2.b;
43
44     return ret;
45 }
46
47 int main()
48 {
49
50     Complex c1(1, 2);
51     Complex c2(3, 4);
52     Complex c3 = c1 + c2; // c1.operator + (c2)
53
54     printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
55
56     return 0;
57 }

小结:

操作符重载是C++的强大特性之一;

操作符重载的本质是通过函数扩展操作符的功能;

operator关键字是实现操作符重载的关键

操作符重载遵循相同的函数重载规则

全局函数成员函数都可以实现对操作符的重载.

原文地址:https://www.cnblogs.com/lemaden/p/10118209.html

时间: 2024-10-03 18:57:58

操作符重载的概念的相关文章

第30课 操作符重载的概念

需要解决的问题: 第一种解决方案: 运行结果如下: 上图中将a和b定义成公有的暴露出来不符合面向对象封装的原则. 第二种方案如下: 虽然解决了复数相加的问题,但是并不完美,显得不自然,我们能否使用c1+c2的这种方式呢? 思考: 操作符重载: 重载的深层次意义就在于可以扩展系统已经存在的功能. 用operator定义的函数就直接用来重载操作符了. 示例: 1 #include <stdio.h> 2 3 class Complex 4 { 5 int a; 6 int b; 7 public:

函数重载,操作符重载(王桂林视频笔记)

匹配原则: 1 严格匹配找到则调用 2 通过隐式转换寻找一个匹配,找到则调用 3 上述两项找不到就会报错 ?(隐式)自动转换类型中 double可以转成 float 但是float转换成double会出错,8字节到4字节,损失精度 ? c++允许 int 到 long 和 double 隐式类型转换,遇到这种情况会引起二义性,解决办法可以是使用强制类型转换 ? 鉴于上述, 设计的时候尽量避开隐式类型转换 底层实现:命名倾轧 name mangling mystrlen函数的功能是计算字符串的长度

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

C++ STL 基础及应用(2) 模板与操作符重载

本章将阐述一些具体的 STL 模板思想,并简单介绍操作符重载与模板的联系. 模板是 C++ 语言中重要的概念.它提供了一种通用的方法来开发重用的代码,即以创建参数化的 C++ 类型.模板分为两种类型:函数模板和类模板.函数模板的用法同 C++ 预处理器的用法有一定的类似之处,它们都提供编译代码过程中的文本替换功能,但函数模板还能对类型进行一定的保护.使用类模板可以编写通用的.类型安全的类. 1.编写一个数组元素求和的函数模板. #include <iostream> using namespa

lua 14 metatable (类似操作符重载)

转自:http://www.runoob.com/lua/lua-metatables.html 感性认识: "Lua中Metatable这个概念, 国内将他翻译为元表. 元表为重定义Lua中任意一个对象(值)的默认行为提供了一种公开入口. 如同许多OO语言的操作符重载或方法重载. Metatable能够为我们带来非常灵活的编程方式. 具体的说, Lua中每种类型的值都有都有他的默认操作方式, 如, 数字可以做加减乘除等操作, 字符串可以做连接操作, 函数可以做调用操作, 表可以做表项的取值赋值

C++解析(17):操作符重载

0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Complex { int a; int b; public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } int getA() { return a; } int getB() { return b; } friend Compl

C++--操作符重载 复数类

一.操作符重载 Q:下面的复数解决方案是否可行? class Complex { public: int a; int b; }; int main() { Complex c1={1,2}; Complex c2={3,4}; Complex c3=c1+c2; return 0; } 该段代码想要实现的是将两个复数类进行相加得出第三个类代码实现的运行结果由上面的结果图可以得知,出现的错误是无法匹配+号操作符的操作,同时出现 的潜在问题是a与b是public成员,在实际的操作中应将a与b设置为

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我