首页 > 编程语言 >C++ operator关键字(重载操作符)

C++ operator关键字(重载操作符)

时间:2023-06-12 10:01:23浏览次数:42  
标签:函数 对象 C++ 重载 int 操作符 增量 operator


operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。


   这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另

一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

 一、为什么使用操作符重载?
      对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义class,

如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。比

如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要

考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时

候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,

所以,需要用户自己来提供该参数版本的实现。


二、如何声明一个重载的操作符?

A:  操作符重载实现为类成员函数

重载的操作符在类体中被声明,声明方式如同普通成员函数一样,只不过他的名字包含关键字operator,以及紧跟其

后的一个C++预定义的操作符。

可以用如下的方式来声明一个预定义的==操作符:


1. class
2. 
     private: 
   
3. int
4. 
     public: 
   
5. int
6. 
     { 
   
7. this->age=a; 
   
8. 
     } 
   
9. inline 
    bool operator == ( 
    const person &ps) 
    const; 
   
10. 
     };


实现方式如下:

1. inline 
    bool person::operator==( 
    const person &ps) 
    const
2. 
     { 
   
3.  
   
4. if ( 
    this->age==ps.age) 
   
5. return 
    true; 
   
6. return 
    false; 
   
7. 
     }


调用方式如下:

1. #include<iostream>
2. 
     using namespace std; 
   
3. int
4. 
     { 
   
5. 10); 
   
6. 20); 
   
7. if(p1==p2) 
   
8. return 
    0; 
   
9. 
     }


这里,因为operator ==是class person的一个成员函数,所以对象p1,p2都可以调用该函数,上面的if语句中,相当

于p1调用函数==,把p2作为该函数的一个参数传递给该函数,从而实现了两个对象的比较。


B:操作符重载实现为非类成员函数(全局函数)


对于全局重载操作符,代表左操作数的参数必须被显式指定。例如:

1. "code" 
    class= 
    "objc"> 
    #include<iostream>
2. 
     using namespace std; 
   
3. class
4. 
     { 
   
5. 
     public: 
   
6. int
7. 
     public: 
   
8. int _age = 
    0) 
   
9. 
     :age(_age) 
   
10. 
     { 
   
11. "person(int _age )"<< endl; 
   
12. 
     } 
   
13.  
   
14. 
     person(person& ps) 
   
15. 
     { 
   
16. this
17. 
     } 
   
18. 
     }; 
   
19. bool operator==(person& p1, person 
    const & p2) 
    //全局重载操作符==
20. 
     { 
   
21. if
22. 
     { 
   
23. return 
    true; 
    //满足要求
24. 
     } 
   
25. return 
    false; 
   
26. 
     } 
   
27. int
28. 
     { 
   
29. 
     person rose; 
   
30. 
     person jack; 
   
31. 18; 
   
32. 23; 
   
33. if
34. 
     { 
   
35. " is equal "
36. 
     } 
   
37. "not equal "
38. return 
    0; 
   
39. 
     }



C:如何决定把一个操作符重载为类成员函数还是全局名字空间的成员呢?


①如果一个重载操作符是类成员,那么只有当与 它的左操数是该类的对象时,该操作符才会被调用。如果

该操作符的左操作数必须是其他的类型,则操作符必须被重载为全局名字空间的成员。

②C++要求赋值=,下标[],调用(), 和成员指向-> 操作符必须被定义为类成员操作符。任何把这些操作符定义为名

字空间成员的定义都会被标记为编译时刻错误。

③如果有一个操作数是类类型如string类的情形那么对于对称操作符比如等于操作符最好定义为全局名字空间成员。

D:操作符重载适用范围:


C++ operator关键字(重载操作符)_运算符


C++ operator关键字(重载操作符)_操作符_02


E:重载运算符的限制:


1、只有C++预定义的操作符才可以被重载;

2、对于内置类型的操作符,它的预定义不能改变,即不能改变操作符原来的功能;

3、重载操作符不能改变他们的操作符优先级;

4、重载操作符不能改变操作数的个数;

5、除了对()操作符外,对其他重载操作符提供缺省实参都是非法的; 

F:注意

      

1、当返回值不是本函数内定义的局部变量时就可以返回一个引用。在通常情况下,引用返回值只用在需对函

数的调用重新赋值的场合,也就是对函数的返回值重新赋值的时候。(以重载赋值= 为例!)

如果返回值:返回的局部对象,在赋值语句结束之后释放,函数返回时保存的临时变量为该对象;
如果返回引用:返回的局部对象,在函数返回时释放,函数返回时保存的临时变量为该对象的引用(地址);


2、在增量运算符中,放上一个整数形参,就是后增量运行符,它是值返回,对于前增量没有形参,而且是引用返回。

例如:

1. class
2. 
     { 
   
3. 
     public: 
   
4. int x = 
    3) 
   
5. 
     { 
   
6. 
     m_value = x; 
   
7. 
     } 
   
8. //前增量
9. int); 
    //后增量
10. 
     private: 
   
11. int
12. 
     }; 
   
13. 
     Test& Test::operator++() 
   
14. 
     { 
   
15. //先增量
16. return * 
    this; 
    //返回当前对象
17. 
     } 
   
18. int) 
   
19. 
     { 
   
20. this); 
    //创建临时对象
21. //再增量
22. return temp; 
    //返回临时对象
23. 
     }

在函数的运行前执行还是运行后执行

y=i++;//先执行y=i,再执行i=i+1
y=++i;//先执行i=i+1,再执行y=i

使用前增量时,对对象(操作数)进行增量修改,然后再返回该对象.所以前增量运算符操作时,参数与返回的是同一个对象.着与基本数据类型的前增量操作相似,返回的也是左值.
使用后增量时,必须在增量之前返回原有的对象值.为此,需要创建一个临时对象,存放原有的对象,以便对操作数(对象)进行增量修改时,保存最初的值.后增量操作返回的是原有对象的值,不是原有对象,原有对象已被增量修改,所以返回的应该是存放原有对象值的临时对象.

在增量运算符定义中,放上一个整数形参,就是后增量运算符.

在函数的运行前执行还是运行后执行


标签:函数,对象,C++,重载,int,操作符,增量,operator
From: https://blog.51cto.com/u_16081664/6459738

相关文章

  • C++ 运算符重载讲解与经典实例
    C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如: classcomplex{public:complex(doubler=0.0,doubleI=0.0){real=r;imag=I;}voiddisplay();private:doublereal;doubleimag;};comple......
  • C++面试八股文:如何在堆上和栈上分配一块内存?
    C++面试八股文:如何在堆上和栈上分配一块内存?某日二师兄参加XXX科技公司的C++工程师开发岗位6面:面试官:如何在堆上申请一块内存?二师兄:常用的方法有malloc,new等。面试官:两者有什么区别?二师兄:malloc是向操作系统申请一块内存,这块内存没有经过初始化,通常需要使用memset手......
  • (一)、C++学习随笔:指针
    北京时间2023年6月11日22点53分,天气总体晴,温度适宜。没写随笔差不多一年了,也从佛山的广发银行、美的外包跳槽到了深圳坂田这边的华为OD,JAVA或许是干的不太愿意深入了,想学习下C++。今天学习到C++的重点之一:指针,鄙人不才,记忆力不太好,所谓的好记性不如烂笔头,把学到的指针知识都记录下......
  • 《C++》C转C++基础2
    跳转语句break、continue、goto。数组一维数组、二维数组创建、赋值、访问同C。函数定义、声明、调用同C,代过。指针变量指针、数组指针、结构体指针同C,代过。结构体结构体、结构体数组、结构体指针同C,代过......
  • C++面试八股文:在C++中,你知道哪些运算符?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:面试官:在C++中,你都知道都哪些运算符?二师兄:啥?运算符?+-*/=这些算吗?面试官:嗯,还有其他的吗?二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。面试官:好的。那你知道这些运算的优先级吗?二师兄:(面试官傻逼吧,这谁记得住)记不住......
  • C++11特性—1
        C++11是C++标准的一个新版本,它增加了很多C++没有的功能,相较性能而言,极大程度上提高了C++效率和易用;对于程序员而言,C++11更好的应用于系统开发和库开发,语法更加泛华和简单化,更加稳定和安全。因此C++11功能更加强大,而且能提升程序员的开发效率。以下我们来了解下C++11基于......
  • C++ 单例模式的各种坑及最佳实践
    单例模式是设计模式中最简单、常见的一种。其主要目的是确保整个进程中,只有一个类的实例,并且提供一个统一的访问接口。常用于Logger类、通信接口类等。基本原理限制用户直接访问类的构造函数,提供一个统一的public接口获取单例对象。这会有一个“先有鸡还是先有蛋”的问题:......
  • ubuntu 搭建 cmake + vscode 的 c/c++ 开发环境
    todo列表clang-formatc++整合软件安装略基本的环境搭建最基本的vscode插件只需要安装如下两个插件即可c/c++扩展是为了最基本的代码提示和调试支持cmakelanguagesupport是为了提示CMakeLists.txt脚本有可能安装了cmakelanguagesupport还是没有代码......
  • C++面试题
    1、当使用C++编写代码时,有一个常见的问题是如何在子类中调用父类的构造函数。下面是一个相关的C++面试题:题目:假设有一个基类Animal,其中包含一个带参数的构造函数和一个公共成员函数display()。请编写一个派生类Dog,继承自Animal,并实现自己的构造函数和display()函数。要求:Dog......
  • C/C++数学口算比赛系统[2023-06-11]
    C/C++数学口算比赛系统[2023-06-11]题目三数学口算比赛系统设计要求:适用于小学生数学口算比赛的系统。比赛题型分为两种:“四则简单运算”和“四则混合运算”,计算机随机出题,选手计时回答。要求进入每种题型比赛时,计算机均有提示,每人的得分情况随时更新。菜单格式如图。基......