C++编程语言中重载运算符(operator)介绍「建议收藏」

C++编程语言中重载运算符(operator)介绍「建议收藏」本文主要介绍在C++编程语言中使用关键字operator重载运算符(也称“重载操作符”)的相关知识,同时通过示例代码介绍使用关键字operator重载运算符的具体方法。1概述1.1Whatoperator是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将operator和待重载的运算符整体(如operator=)视为一个函数名。使用operator重载运算符,是C++扩展运算符功能的方法。使用operator扩展运

大家好,又见面了,我是你们的朋友全栈君。

本文主要介绍在 C++ 编程语言中使用关键字 operator 重载运算符(也称“重载操作符”)的相关知识,同时通过示例代码介绍使用关键字 operator 重载运算符的具体方法。

1 概述

1.1 What

operator 是 C++ 的一个关键字,它和运算符(如 =)一起使用,表示一个运算符重载函数,在理解时可将 operator 和待重载的运算符整体(如 operator=)视为一个函数名。

使用 operator 重载运算符,是 C++ 扩展运算符功能的方法。使用 operator 扩展运算符功能的原因如下:

  • 使重载后的运算符的使用方法与重载前一致;
  • 扩展运算符的功能只能通过函数的方式实现。(实际上,C++ 中各种“功能”都是通过函数实现的)

1.2 Why

C++ 提供的运算符,通常只支持对于基本数据类型和标准库中提供的类进行操作,而对于用户自己定义的类,如果想要通过这些运算符实现一些基本操作(如比较大小、判断是否相等),就需要用户自己来定义这个运算符的具体实现了。

例如,我们设计了一个名为“person”的类,现在要判断 person 类的两个对象 p1 和 p2 是否一样相等,比较规则是比较对象的年龄(person 类的数据成员“age”)大小。那么,在设计 person 类的时候,就可以通过针对运算符“==”进行重载,来使运算符“==”具有比较对象 p1 和 p2 的能力(实际上比较的内容是 person 类中的数据成员“age”)。

上面描述的对运算符“==”进行重载,之所以叫“重载”,是由于编译器在实现运算符“==”功能的时候,已经针对这个运算符提供了对于一些基本数据类型的操作支持,只不过现在该运算符所操作的内容变成了我们自定义的数据类型(如 class),而在默认情况下,该运算符是不能对我们自定义的数据类型进行操作的。因此,就需要我们通过对该运算符进行重载,给出该运算符操作我们自定义的数据类型的方法,从而达到使用该运算符对我们自定义的数据类型进行运算的目的。

1.3 How

实现运算符重载的方式通常有以下两种:

  • 运算符重载实现为类的成员函数;
  • 运算符重载实现为非类的成员函数(即全局函数)。

1.3.1 运算符重载实现为类的成员函数

在类体中声明(定义)需要重载的运算符,声明方式跟普通的成员函数一样,只不过运算符重载函数的名字是“operator紧跟一个 C++ 预定义的操作符”,示例用法如下(person 是我们定义的类):

    bool operator==(const person& ps)
    {
        if (this->age == ps.age)
        {
            return true;
        }
        return false;
    }

示例代码内容如下:

#include <iostream>

using namespace std;

class person
{
private:
    int age;
public:
    person(int nAge)
    {
        this->age = nAge;
    }

    bool operator==(const person& ps)
    {
        if (this->age == ps.age)
        {
            return true;
        }
        return false;
    }
};

int main()
{
    person p1(10);
    person p2(10);
    
    if (p1 == p2)
    {
        cout << "p1 is equal with p2." << endl;

    }
    else
    {
        cout << "p1 is not equal with p2." << endl;
    }
    
    return 0;
}

编译并运行上述代码,结果如下:

C++编程语言中重载运算符(operator)介绍「建议收藏」

通过上述结果能够知道:因为运算符重载函数“operator==”是 person 类的一个成员函数,所以对象 p1、p2 都可以调用该函数。其中的 if (p1 == p2) 语句,相当于对象 p1 调用函数“operator==”,把对象 p2 作为一个参数传递给该函数,从而实现了两个对象的比较。

1.3.2 运算符重载实现为非类的成员函数(即全局函数)

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

示例代码如下:

#include <iostream>

using namespace std;

class person
{
public:
    int age;
};

// 左操作数的类型必须被显式指定
// 此处指定的类型为person类
bool operator==(person const& p1 ,person const& p2)
{
    if (p1.age == p2.age)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    person p1;
    person p2;
    p1.age = 18;
    p2.age = 18;

    if (p1 == p2)
    {
        cout << "p1 is equal with p2." << endl;
    }
    else
    {
        cout << "p1 is NOT equal with p2." << endl;
    }

    return 0;
}

编译并运行上述代码,结果如下:

C++编程语言中重载运算符(operator)介绍「建议收藏」

1.3.4 运算符重载的方式选择

可以根据以下因素,确定把一个运算符重载为类的成员函数还是全局函数:

  • 如果一个重载运算符是类的成员函数,那么只有当与它一起使用的左操作数是该类的对象时,该运算符才会被调用;而如果该运算符的左操作数确定为其他的类型,则运算符必须被重载为全局函数;
  • C++ 要求’=’、'[]’、'()’、’->’运算符必须被定义为类的成员函数,把这些运算符通过全局函数进行重载时会出现编译错误;
  • 如果有一个操作数是类类型(如 string 类),那么对于对称操作符(比如操作符“==”),最好通过全局函数的方式进行重载。

1.3.5 运算符重载的限制

实现运算符重载时,需要注意以下几点:

  • 重载后运算符的操作数至少有一个是用户定义的类型;
  • 不能违反运算符原来的语法规则;
  • 不能创建新的运算符;
  • 有一些运算符是不能重载的,如“sizeof”;
  • =、()、[]、-> 操作符只能被类的成员函数重载。

1.3.6 运算符重载的详细用法

  • 赋值运算符的重载函数(operator=),请点击此处
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137851.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 铝电解电容分类方法

    铝电解电容分类方法铝电解电容分类方法各大厂商的分类方式基本一致,主要按以下几个指标:极性容量耐压温度特性ESR寿命其他一般来说,电解电容实物上都会印上容值耐压值系列号分类的系列号,则各个厂商都有所不同,没有统一标准,比较常用到的都是各家的标准品,例如VT,RVT等。…

    2022年8月22日
    3
  • Axis2创建WebService实例(转载)

    Axis2创建WebService实例(转载)博文地址:http://clq9761.iteye.com/blog/976029

    2022年7月21日
    9
  • 【小程序】手把手带你完成微信小程序开发实践

    【小程序】手把手带你完成微信小程序开发实践帐号相关流程注册范围企业政府媒体其他组织换句话讲就是不让个人开发者注册。:)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账户信息绑定管理员微信企业认证公司对公账户对微信进行打款账户自动验证后,自动认证通过,并将认证资金退回公司对公账户,费用在1元内随机小程序发布流程开发实践这次的demo项目为农历和公历的转换器,重在体验

    2022年9月22日
    0
  • 深度学习超分辨率重建(总结)[通俗易懂]

    本文为概述,详情翻看前面文章。1.SRCNN:—2,3改进开山之作,三个卷积层,输入图像是低分辨率图像经过双三次(bicubic)插值和高分辨率一个尺寸后输入CNN。图像块的提取和特征表示,特征非线性映射和最终的重建。使用均方误差(MSE)作为损失函数。2.FSRCNN特征提取:低分辨率图像,选取的核9×9设置为5×5。收缩:1×1的卷积核进行降维。非线性映射:用两个串联的3×3的卷积核可以…

    2022年4月1日
    37
  • Android4.2.2启动动画前播放视频

    Android4.2.2启动动画前播放视频

    2021年11月13日
    48
  • UART 和 USART 有区别

    UART 和 USART 有区别UART:universalasynchronousreceiverandtransmitter通用异步收发器          [BusSignal]  TX ,RX USART:universalsynchronousasynchronousreceiverandtransmitter通用同步异步收发器          [BusSignal]  T

    2022年5月19日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号