本文主要介绍C++中的重载操作符(operator)的相关知识。

1. 概述

1.1 what

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

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

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

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

比如,我们要设计一个名为“person”的类,现在要判断person类的两个对象p1和p2是否一样大,我们设计的比较规则是按照其年龄来比较,那么,在设计person类的时候,就可以通过对操作符“==”进行重载,来使用操作符“==”对对象p1和p2进行比较了(根据前面的分析,实际上比较的内容应该是person类中的数据成员“age”)。

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

1.3 how

实现一个操作符重载的方式通常分为两种情况:

将操作符重载实现为类的成员函数;
操作符重载实现为非类的成员函数(即全局函数)。
1.3.1 将操作符重载实现为类的成员函数

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

bool operator==(const person& ps)
    {
        if (this->age == ps.age)
        {
            return true;
        }
        return false;
    }
示例代码(operator_test2.cpp)如下:

#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;
}

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

通过上述结果能够知道:因为操作符重载函数“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;
}
编译并运行上述代码,结果如下:

1.3.4 操作符重载的方式选择

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

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

实现操作符重载时,需要注意:

重载后操作符的操作数至少有一个是用户定义类型;
不能违反原来操作数的语法规则;
不能创建新的操作符;
不能重载的操作符包括(以空格分隔):sizeof . .* :: ?: RTTI类型运算符
=、()、[]、以及 ->操作符只能被类的成员函数重载
1.3.6 操作符重载的详细用法

赋值运算符的重载函数(operator=),点击此处
---------------------
原文:https://blog.csdn.net/liitdar/article/details/80654324

C++的重载操作符(operator)介绍(转)的更多相关文章

  1. 重载操作符 operator overloading 学习笔记

    重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...

  2. C++重载操作符operator

    operator是C++关键字,用于对C++进行扩展: 1.可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,> ...

  3. 重载操作符 'operator'

    operator 是 C++ 的(运算符的)重载操作符.用作扩展运算符的功能. 它和运算符一起使用,表示一个运算符函数,理解时应将  [operator+运算符] 整体上视为一个函数名. 要注意的是: ...

  4. C++的重载操作符(operator)介绍

    原文转载至:https://blog.csdn.net/liitdar/article/details/80654324 https://blog.csdn.net/liitdar/article/d ...

  5. [019]转--C++ operator关键字(重载操作符)

    原博客:http://www.cnblogs.com/speedmancs/archive/2011/06/09/2076873.html operator是C++的关键字,它和运算符一起使用,表示一 ...

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

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

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

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

  8. C++ operator(重载操作符) 【转】

    转自:http://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html operator是C++的关键字,它和运算符一起使用,表 ...

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

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名.     这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面 ...

随机推荐

  1. node-log4js3.0.6配置

    const log4js = require('log4js'); const conf = { "appenders": { "access": { &quo ...

  2. js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

    现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[[ ...

  3. HTML中include file的用法

    语法 <!-- #include PathType = "FileName" --> 参数 PathType  路径类型 路径可为以下某种类型: 文件 该文件名是带有  ...

  4. link元素 rel src href属性

    The SRC and HREF attributes are used to include some external entities like an image, a CSS file, a ...

  5. js版的in_array的实现方法

    这是一个JS版的判断数组内的元素的方法. var arr = ['a','b','c']; console.log(in_array('b',arr)); // true function in_ar ...

  6. Webshell密码极速爆破工具 – cheetah

    https://www.t00ls.net/thread-39660-1-1.html

  7. PHP(层叠样式表,写法分类),选择器的种类)

    表单元素的取值怎么取  对应的属性值都有哪些? <span> 标签被用来组合文档中的行内元素. 注释:span 没有固定的格式表现.当对它应用样式时,它才会产生视觉上的变化. style ...

  8. PHP(表单元素)

    表单: 1.收集用户的输入,发送到后台 <form action="后台地址" method="提交方式" enctype="multipart ...

  9. String字面量

    public class assa{ static String ee = "aa";//ee指向常量池中的aa static String ff = new String(&qu ...

  10. 用java代码解决excel打开csv文件乱码问题

      Java 读取csv文件后,再保存到磁盘上,然后直接用Excel打开,你会发现里面都是乱码. 贴上代码: public class Test { public static void main(S ...