• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ operator关键字(重载操作符)的用法详解

C++ operator关键字(重载操作符)的用法详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ operator,c++中的operator,c++ bool operator,operator关键字,operator等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

 一、为什么使用操作符重载?

对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。比如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以,需要用户自己来提供该参数版本的实现。

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

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

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

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

class person{
private:
  int age;
  public:
  person(int a){
    this->age=a;
  }
  inline bool operator == (const person &ps) const;
};
</div>

实现方式如下:

inline bool person::operator==(const person &ps) const
{

   if (this->age==ps.age)
    return true;
   return false;
}

</div>

调用方式如下:

#include
using namespace std;
int main()
{

 person p1(10);
 person p2(20);
 if(p1==p2) cout<<”the age is equal!”< return 0;
}

</div>

这里,因为operator ==是class person的一个成员函数,所以对象p1,p2都可以调用该函数,上面的if语句中,相当于p1调用函数==,把p2作为该函数的一个参数传递给该函数,从而实现了两个对象的比较。

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

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

#include
#include
using namespace std;
class person
{
public:
int age;
public:
};

bool operator==(person const &p1 ,person const & p2)

//满足要求,做操作数的类型被显示指定
{
if(p1.age==p2.age)
return true;
return false;
}
int main()
{
person rose;
person jack;
rose.age=18;
jack.age=23;
if(rose==jack)
cout<<"ok"< return 0;
}

</div>

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

①如果一个重载操作符是类成员,那么只有当与他一起使用的左操作数是该类的对象时,该操作符才会被调用。如果该操作符的左操作数必须是其他的类型,则操作符必须被重载为全局名字空间的成员。

②C++要求赋值=,下标[],调用(), 和成员指向-> 操作符必须被定义为类成员操作符。任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错误。

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

D:重载操作符具有以下限制:

(1)只有C++预定义的操作符集中的操作符才可以被重载;

(2)对于内置类型的操作符,它的预定义不能被改变,应不能为内置类型重载操作符,如,不能改变int型的操作符+的含义;

(3) 也不能为内置的数据类型定义其它的操作符;

(4) 只能重载类类型或枚举类型的操作符;

(5) 重载操作符不能改变它们的操作符优先级;

(6) 重载操作符不能改变操作数的个数;

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

E: 注意点

(1)后果载操操作符首先要确定它的返回值是左值,还是右值,如果是左值最返回引用,如果是右值那就直接返回值;

(2) +号等这样的操作符没有对象可以容纳改变后值,对于这样的情况最好返回数值,否则只能要操作符体内创建临时对象用于容纳改变后的值,如果在堆中创建临时对象返回指针或者引用,在操作符函数体外还需要释放它,如果返回的对象而不是引用或者指针,那么效率是比较低的。如果返回的是数值,最好在该类的构造函数中增加对该类型数值的转换函数,如:返回值是int类型,那么最好有一个int类型作为参数的构造函数。

(3)在增量运算符中,放上一个整数形参,就是后增量运行符,它是值返回,对于前增量没有形参,而且是引用返回,示例:

class Test

{

  public:

  Test(x=3){ m_value = x}

  Test &operator ++();  //前增量

  Test &operator ++(int);//后增量

private:

  Int m_value:

};

Test &Test::operator ++()

{

  m_value ++;  //先增量

  return *this; //返回当前对象

}

Test Test::operator ++(int)

{

  Test tmp(*this); //创建临时对象

  m_value ++;    //再增量

  return temp;   //返回临时对象

}

</div>

(4)因为强制转换是针对基本数据类型的,所以对类类型的转换需自定义;

(5) 转换运行符重载声明形式:operator 类型名();它没有返回类型,因为类型名就代表了它的返回类型,所以返回类型显得多余。

(6)一般来说,转换运算符与转换构造函数(即带一个参数的构造函数)是互逆的,如有了构造函数Test(int),那么最好有一个转换运算符int()。这样就不必提供对象参数重载运算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重载+号操作符了,因为对于a1+a2的运算,系统可能会先找有没有定义针对Test的+号操作符,如果没有,它就会找有没有针对Test类转换函数参数类型的+号操作符(因为可以将+号运行结果的类型通过转换函数转换为Test对象),因为Test类有个int类型的参数,对于int类型有+操作符,所以a1+a2真正执行的是Test(int(a1) + int(a2));即Test(3);

(7)对于转换运算符,还有一个需要注意的地方就是,如果A类中有以B为参数的转换函数(构造函数),那B中不能有A的转换运算符,不然就存在转换的二义性,如:

class A{A(B&){…}}; class B{ operator A(){…}};

那么以下语句就会有问题:

B b; A(b);//A(b)有就可能是A的构造函数,也可以是B的转换运算符

以上就是小编为大家带来的C++ operator关键字(重载操作符)的用法详解全部内容了,希望大家多多支持~

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ operator关键字(重载操作符)的用法详解
  • 浅谈C++虚重载操作符 virtual operator= 的使用方法
  • C++中Operator类型强制转换成员函数解析
  • operator new在C++中的各种写法总结
  • 全面解析C++中的new,operator new与placement new
  • 解析c++中的默认operator=操作的详解

相关文章

  • 2017-05-28C语言程序设计50例(经典收藏)
  • 2017-05-28弦图ZOJ 1015 Fishing Net 判定方法
  • 2017-05-28深入解析C++中的引用类型
  • 2017-05-28C++ COM编程之QueryInterface函数(一)
  • 2017-05-28C语言线性表的顺序表示与实现实例详解
  • 2017-05-28C++常对象精讲_const关键字的用法
  • 2017-05-28c++友元函数与友元类的深入解析
  • 2017-05-28解析C++中的5个存储类的作用
  • 2017-05-28基于C++内存分配、函数调用与返回值的深入分析
  • 2017-05-28深入解析设计模式中的适配器模式在C++中的运用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言中的abs()函数和exp()函数的用法
    • c++利用stl set_difference对车辆进出区域进行判定
    • C++第11版本中的一些强大的新特性小结
    • c++中容器之总结篇
    • C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别
    • C++ COM编程之接口背后的虚函数表
    • 基于C语言指令的深入分析
    • 用C实现PHP扩展 Fetch_Url 类数据抓取的方法
    • 解析在main函数之前调用函数以及对设计的作用详解
    • C++中一维数组与指针的关系详细总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有