C++ 运算符重载_加号

C++运算符重载

C++运算符重载是C++中一个非常重要的概念,很多初学者(包括我)在刚开始学习的时候非常害怕,甚至讨厌(也许是恶心)。但是,不得不说的是,它真的很重要,学会之后很方便(ZhuangBi)。


加号运算符重载

加号是一个典型的双目运算符(需要两个操作数),加号前一个,加号后一个。实现加号运算符重载有两种方式:1.类成员方法实现、2.全局方法实现

1.类成员方法实现

谈一下我对加号运算符重载的理解,因为如果不理解原理,就会觉的运算符重载语法有点(变态),如果只想知道实现方法的请直接跳到代码部分

在没有使用运算符重载之前,我们实现两个自定义类型相加通常都是使用类成员函数实现的。比如下图这种:

C++ 运算符重载_加号

其中 p1.addPerson(p2) 就等价于 p1 + p2

而加号的运算符重载也是一个函数,不过名字比较奇怪而已:operator+( )

可以理解为,两个对象相加时等价于 p1.addPerson(p2)  然后经过编译器优化后,可以简写为  p1 + p2。所以在成员方法实现运算符重载时仅仅需要传入一个参数(另外一个是隐藏的this指针)。

C++ 运算符重载_加号

我想表达的意思大概就像上图这样,基本上就是 p1 + p2 只是 p1.operator+ (p2) 这个比较奇怪函数的简写,而这个函数本身和addPerson()没什么区别,仅仅是名字上的区别而已。

类成员方法实现 完整代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Person {
 5 public:
 6     Person();
 7     Person(int val);
 8     Person operator+(const Person& p);//运算符重载 函数定义
 9 private :
10     int m_age;
11 };
12 
13 int main() {
14     Person p1;
15     Person p2;
16     Person p3 = p1 + p2;//重载后的效果
17     return 0;
18 }
19 
20 Person::Person() :m_age(10) {
21     cout << "无参构造函数" << endl;
22 }
23 Person::Person(int val) : m_age(val) {
24     cout << "有参构造函数" << endl;
25 }
26 Person Person:: operator+(const Person& p) {//运算符重载 实现
27     Person tmp;
28     tmp.m_age = this->m_age + p.m_age;
29     return tmp;
30 }

 


 

2.全局方法实现

对于全局方法的实现,就类似于定义了一个全局函数实现两个对象相加,如下图:

C++ 运算符重载_加号

而运算符重载函数(下面完整代码的13~17行),也只是一个具有特殊名称(operator+)的相加函数而已,它和 add 函数没有本质上的区别。

调用上也应该是一样的 operator+( p1, p2),不过我们不能这么写,而是写了 p1 + p2 ,在编译器内部把这个表达式 当作 operator+( p1, p2 )处理。

全局方法实现 完整代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Person {
 5 public:
 6     friend Person operator+(Person& p1, Person& p2);//把全局方法设为友元函数,便于访问私有变量
 7     Person() :m_age(0) {}//初始化一个值
 8     Person(int val) :m_age(val) {}
 9 private:
10     int m_age;
11 };
12 //2.全局的重载方法
13 Person operator+(Person& p1, Person& p2) {
14     Person tmp;
15     tmp.m_age = p1.m_age + p2.m_age;
16     return tmp;
17 }
18 
19 int main() {
20     Person p1(10);
21     Person p2(11);
22     Person p3 = p1+p2;
23     return 0;
24 }

 

原文链接: https://www.cnblogs.com/weidawang/p/11992365.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++ 运算符重载_加号

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/307075

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午4:58
下一篇 2023年2月16日 上午4:58

相关推荐