第30课 操作符重载的概念

需要解决的问题:

第一种解决方案:

运行结果如下:

上图中将a和b定义成公有的暴露出来不符合面向对象封装的原则。

第二种方案如下:

虽然解决了复数相加的问题,但是并不完美,显得不自然,我们能否使用c1+c2的这种方式呢?

思考:

操作符重载:

重载的深层次意义就在于可以扩展系统已经存在的功能。

用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 }

我们只是将第二个解决方案中的Add换成了operator +,这就完成了重载。

运行结果如下:

我们将主函数改成c1+c2的形式:

依然编译运行通过了。

当编译器看到c1 + c2时,发现c1和c2不是基本类型,它本身不能完成这两个数的加法,于是就开始去查找有没有这个+的重载,于是就调用到了重载函数。

上面的额重载是全局函数,而且使用了友元,现在继续改进:

编译器优先在成员函数中寻找操作符重载函数。

示例:

运行结果如下:

将全局函数的重载和类成员函数的重载全部定义:

 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 }

运行结果如下:

可以看到优先调用的是成员函数的重载操作符。

小结:

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9571535.html

时间: 2024-11-07 14:21:13

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

操作符重载的概念

复数计算第一种形式(自定义复数类): 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 }

07.30《JavaScript》——JS中的函数没有重载的概念

JS中的函数没有重载的概念 js中不像是java,拥有重载的概念,所以函数名相同的函数,js会认为是同一个函数,所以会输出写在最后的一个函数的结果. function test(){ alert(arguments[0]); } function test(x){ alert(x) } function test(x,y){ alert(x+" "+y) } test(7); 结果是: 原文地址:https://www.cnblogs.com/justlive-tears/p/9393

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

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

第二十篇:类操作符重载的相关规定与具体实现示例

前言 有书这么说过,C++设计的最大目的在于允许程序员定义自己的类型,并使它们用起来跟内置类型一样容易和直观.就目前看来,要实现这一点,最核心的莫过于操作符的重载.科学的重载可以让类的使用最大程度地接近内置类型.本文将讨论类操作符重载涉及到的一些原则和具体做法. 实现类操作符重载的两种思路 1. 友元函数法: 将待重载操作符视作非成员函数( 它声明为操作数类型的友元函数 ) 应当采用这种机制重载的运算符有:IO操作符,算数操作符,关系操作符. 2. 成员函数法: 将待重载操作符视作特殊的成员函数

C++ operator overload -- 操作符重载

C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 #include <iostream> #include <string> using namespace std; /* defualt operator= differ from my own one. * assign 0 or 1 to TEST_EQ, look the dif

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

匹配原则: 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++学习笔记-操作符重载

操作符重载(operator overloading)是一种形式的C++多态,C++将操作符重载扩展到用户自定义的类型,如允许使用+将两个自定义的对象相加,编译器将根据操作数的数目和类型决定使用那种加法定义. 要重载操作符,需使用操作符函数,格式如下: operator op (argument-list) op:要重载的操作符 argument-list: 操作数 操作符函数可以是类的成员函数,也可以是友元函数,如果是类成员函数,则第一个操作数是调用对象,它不在argument-list中.