C++ 操作符重载

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

操作符介绍

从微机原理中我们就知道了精简指令集计算机RISCReduced Instruction Set Computer中的指令分为操作符和操作数。其中操作按照参数个数分为:一元操作符和二元操作符。发展到C++等高级语言时,操作符又可以根据功能分为:算术、关系、位操作、逻辑运算、成员运算、函数调用、索引(下标)、递增、递减操作符。为了理解操作符重载,简单说一些重要的操作符。

²        一元操作符(Unary Operators

逻辑反

&

取地址

~

异或

*

指针去引用(dereference

+

一元加

++

递增

-

一元负

--

递减

²        二元操作符(Binary Operator

二元操作符的数目远大于一元操作符,如+-*/<>!===!=等,不再详细列出。

²        赋值操作符(Assignment Operators

赋值操作符,即=,是编译器提供的默认操作符,如果操作符一个类没有赋值操作符,将使用编译器的默认赋值操作符。另外,默认操作符不能被继承,即父类虽然重载了赋值操作符,但是如果派生类没有重载此操作符,派生类将还是使用默认赋值操作符,而不是父类的的赋值操作符。最后,赋值操作符不能作为静态成员函数存在,即只能对对象实例使用此操作符。

²        函数调用操作符(Function Call Operators

函数调用操作符,即(),常见于标准模板库STLStandard Template Library的仿函数定义。STL的大多数算法都有带仿函数版本;所谓仿函数即是重载了函数调用操作符的类,此操作符的功能就是调用函数。

²        下标操作符(subscripting)

下标操作符,即[],用于快速引用数组元素。所有的STL容器都提供下标操作符,如vector,如果定义了vector<int> vInts,就能使用vInts[i]的形式来访问其元素。

²        成员访问操作符(Member Access Operators

成员访问操作符有2个:->.,后者不能重载,主要用于访问成员变量。->的重载也比较少见,大多数情况下都不需要重载成员访问操作符。

²        递增和递减操作符(Increment and Decrement Operators

递增操作符,即++;递减操作符,即--。需要注意的时,对于复合类型(非int等简单类型),操作符在前与后有着效率上的区分,如++aa++,后者由于构造临时对象,所以效率更低。

²        不能重载的操作符

对于大多数编译器而言,有一些操作符都是不能重载的。

.

成员访问

.*

Pointer-to-member selection

::

作用域

?:

条件赋值

#

转换位字符串的预处理

##

预处理连接

对不同编译器而言,还有别的操作符不能重载。

操作符重载的通用原则

²        为何进行操作符重载

原因主要有这样一些:

Ø         数学计算的需要,如为复数重载+-*/

Ø         使程序变得精练,如重载<<>>操作符使调试类变得容易;

Ø         标准库函数的需要,如仿函数需要重载()map需要重载<

Ø         对象间操作的需要。

Ø         操作符重载的通用原则

从编程实践中,人们总结了以下一些原则,来指导对操作符的重载:

Ø         不能定义新的操作符,只能重载;

Ø         不能重载针对简单类型的操作符;

Ø         操作符重载,只能在成员函数和友元(全局)两种方法中选择一种;

Ø         操作符的优先级等熟悉不会发生变化;

Ø         重载的操作符不能有默认参数;

Ø         除了赋值操作符和成员访问操作符.,其它操作符都能继承;

Ø         基于成员函数方式的操作符重载的第一个残杀都是调用者类型(或者派生类),不能对第一个参数进行转换。

几类重要操作符重载的说明

²        流操作符<<>>

流操作符<<>>分别对应C++标准库中的istreamostream,一般而言,应该为大多数类重载此操作符;因为输出操作符可用于测试和调试,并方便调用库函数的上层应用者。另外,输出输入操作符函数一种对象持久化的低成本实现方式。

要重载流操作符,通常将此操作符定义为类的友元函数,否则类本身必须使istreamostream的派生类;另外在重载操作符时,还通常返回istream&ostream&,这样返回值可以作为下一个操作符的输入,从而实现操作符的链接,如cout << a1 << a2 << endl,其中a1a2分别为实现了流操作符重载的类A的实例。

流操作符的第一个参数时istreamostream的引用,这是因为需要更新流的内部状态;而第二个参数为类的引用,这对<<而言是为了效率(可以定义为常量引用),对>>而言是需要接受修改的内容。

²        赋值操作符=

赋值操作符的最重要问题就是深Copy的问题,即对指针成员,需要重新申请空间,在copy内容,以免两个实例的成员指向同一块地址;默认赋值操作符是浅Copy的,这时指针成员会指向同一块地址。

其次一个小技巧:需要在重载时返回*this的引用,以实现连续赋值,即a1=a2=1

²        转换操作符()

实现类型间转换通常有2种转换方式(除去强制类型转换,如static_cast):通过构造函数和转换操作符。通过构造函数比较容易,如:

Class MyClass

{

public:

    MyClass(const string&);

};

即实现了把类型string转换为类型MyClass

通过转换操作符,需要在类中重载(),如:

Class MyClass

{

public:

MyClass(const string&);

operator string() const;

};

这样就能在需要的时候调用转换操作符实现转换,如string str = (string)my_class_instance

²        逻辑操作符&&||

这类操作符绝不能够重载,虽然编译器允许此类重载;否则,程序会变得晦涩难懂。如if((p=0) && (strlen(p)>10)的语句中,第一个条件为true,才会检查第2个参数。如果对全局操作符&&重载,以使在任何条件下都要检查第2个参数,如if(operator&&(p!=0, strlen(p)>10)),虽然可以做,但是理解混乱了。

小结

一般而言,其它操作符(除了算术运算符、赋值操作符、下标操作符、流操作符、函数调用操作符等)最好不要去重载,因为这会造成程序可读性的降低。另外,反过来讲,用函数实现该功能却是一个更好的选择。

参考书目

²        Effective C++Scott Meyers.

²        More Effective C++, Scott Meyers.

²        STL源码剖析,侯捷。

C++操作符重载 注意:操作符重载可以当做==“自定义类的运算”== 1 为什么需要操作符重载? 对于基础的变量,int等,不需要重载就知道如何做,但是对于自定义类,就无法进行运算,比如复数类。 2 操作符重载总结 1)操作符重载本质上是一个函数,可以采用 友元函数或者成员函数实现。但是采用这两种函数传递参数、实现代码、应用场合均不同。 全局函数与成员函数的比较: 全局函数中不传递this指针,成员函数默认传递this指针,因此成员函数可以少一个参数; 成员函数可以访问私有变量,全局函数需要转化为友元函数才可以。 2)操 阅读详情

相关推荐

【脑电信号处理与特征提取】P2-夏晓磊:脑电的神经起源与测量

ElectroEncephaloGraphyTherefore, EEG produces a graphed representation of the electrical activity occurring in a person’s brain.(把一个人的大脑中的电活动画出来)脑电头皮表面记录到的大脑活动产生的电信号(微伏)。(记录位置:硬脑膜/大脑皮层表面- ECoG,神经元群- LFP与MUR/MUA:活动位置:心电、眼电、肌电等)脑电图电压随时间变化的波形图。

m0_51474171的博客 1869

C++运算符重载技术

前言:C++语言给使用提供重载机制,大大提高的使用的灵活性。 1 函数重载概念 1 函数重载概念 函数重载(Function Overload) 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 函数重载的判断标准 参数个数不同 参数类型不同 参数顺序不同 注意: 不能把返回值作为函数重载的条件,原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会...

Kroner的博客 479

处理图数据, 安装“Pytorch“ + 图神经网络开源框架“PyG “+ “ogb“使用

"OGB" OSError: [WinError 127] 找不到指定的程序。1.[遇到这类问题往往跟torch安装的工具包(如torch-sparse,torch-scatter,torch-cluster)版本没对应上有关](https://blog.csdn.net/weixin_42358688/article/details/117433691)2.[OGB使用环境安装与依赖](https://ogb.stanford.edu/docs/home/)Data Loaders3.[torch-geo

Fuguir™的博客 3681

C++操作符重载

简要介绍了各种操作符重载方式与实现

shadow_xwl的博客 5734

c++操作符重载

转自https://www.cnblogs.com/xudong-bupt/p/3557525.html 1.什么是操作符重载   可以使用分词将操作符重载理解为:操作符+重载。   C++中的操作符很多,如+,-,*,\等等。   C++中的重载也是C++中面向对象多态的体现。   简单说操作符重载:     C++中有:int a=2+3;  那么a=5     操作符重载可以实...

hjxu2016的博客 4087

C++语言学习(八)——操作符重载

C++语言学习(八)——操作符重载 一、操作符重载基础 1、操作符重载的语法 通过operator关键字可以定义特殊的函数,operator本质是通过函数重载操作符。 Type operator operatorname(const Type p1, const Type p2) { Type ret; return ret; } 2、友元函数重载操作符 可以将操作符重载函数声明...

weixin_34198881的博客 702

C++重载操作符与转换】重载操作符的定义

C++中,操作符重载(Operator Overloading)是一项强大的特性,它允许开发者为自定义类型(如类或结构体)重新定义内置操作符的行为。通过重载操作符,可以使自定义类型的对象表现得像内置类型一样自然,从而提升代码的可读性和可维护性。然而,操作符重载也是一把双刃剑,如果使用不当,可能会导致代码难以理解和调试。

byte轻骑兵的技术小窝 2053

C++重载操作符与转换】赋值操作符

C++ 编程中,赋值操作符重载是一项强大且实用的特性。它允许我们为自定义类重新定义赋值操作的行为,使得对象之间的赋值操作更加灵活和符合业务逻辑。本文深入探讨 C++ 中赋值操作符重载的相关知识,从基础概念到实际应用,通过丰富的代码示例和详细的解释,全面掌握这一重要特性。

byte轻骑兵的技术小窝 2057

Cpp_操作符重载

一、双目操作符重载1.计算类双目操作符 形如L#R的表达式会被编译器处理为形如L.operator#(R)的成员函数的调用,该函数的返回值即为表达式的值。 形如L#R的表达式也可以被编译器处理为形如::operator#(L,R)的全局函数的调用,该函数的返回值即为表达式的值。 2.赋值类双目操作符 表达式的值是一个左值,而且它就是左操作数本身。 左操作数不能是常量,右操作数可以是常量。

Jerry的专栏 1367

C++操作符重载(不能被重载操作符

C++中的运算符: 名称 运算符 算数运算符 +、-、/、%、++、– 位操作运算符 &amp;amp;amp;、 逻辑运算符 !、&amp;amp;amp;&amp;amp;amp;、 比较运算符 &amp;amp;lt;、&amp;amp;gt;、&amp;amp;lt;=、&amp;amp;gt;=、==、!= 赋值运算符 =、+=、-=、*=、/=、%=、 其

ZWE7616175的博客 8338

c++重载操作符

c++支持重载操作符有算术操作符+、-、*、/、%关系操作符==、!逻辑操作符!、&&、||位操作符赋值操作符下标操作符[]函数调用操作符()成员访问操作符->指针操作符*(解引用)、&(取地址)逗号操作符这些操作符按照操作数个数不同分为单目操作符、双目操作符、多目操作符单目操作符!、~、->、*(解引用)、&(取地址)双目操作符其他多目操作符()为什么要按这个分类?别急,继续看...

米碎师兄 2417

C++类—重载操作符

重载操作符是具有特殊名称的函数:保留字operator后接定义的操作符符号。如: [cpp] view plaincopy Sales_item operator+(const Sales_item &,const Sales_item &);   除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针

xietingcandice的专栏 2578

C++基本操作符重载

基本操作符重载基本操作符重载reference 基本操作符重载 操作符重载指的是将 C++ 提供的操作符进行重新定义,使之满足我们所需要的一些功能。 在 C++ 中可以重载操作符有: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> <<= >>= == != <= >= && ||

嵌入式与人工智能 3359

C++重载操作符[ ]

1.首先说说为什么要重载操作符[ ] 主要是因为系统只给了整数类型(int)的重载函数,即只能在方括号中输入整数进行查找,但有时候我们可能存放数据时,下标的类型是自定义的,希望也能像数组直接通过下标访问元素的形式(形如A[i]) ,这时候就需要对下标操作符[]进行重载,使得操作得以进行 2.重载操作符[]的作用 一般作用是取值,引用返回值是这个值得别名,引用返回是返回原来的东西,在内存上...

anna2117的博客 807

C++中的操作符重载

c++中,我们可以定义一个函数完成某种功能,当我们想完成的功能与通用操作符完成的功能一致时就需要进行操作符重载来方便我们的应用。 如String类的两个对象,相加时我们可以实现append或者add函数,但是如果采用“+”会觉得更加方便。 所以我们重载+操作符,而

yumengkk的专栏 932

C++中逗号操作符重载

文章目录1 C++中逗号操作符重载1.1 逗号操作符的原生语义1.2 重载逗号操作符 1 C++中逗号操作符重载 1.1 逗号操作符的原生语义 逗号操作符(,)可以构成逗号表达式: 逗号表达式用于将多个子表达式连接为一个表达式。 逗号表达式的值为最后一个子表达式的值。 逗号表达式中的前N-1个子表达式可以没有返回值。 逗号表达式按照从左向右的顺序计算每个子表达式的值。 逗号表达式的示例:...

木子皿--啥都不会的菜鸟 1761

CPP中重载赋值操作符

在CPP中,析构函数,拷贝构造函数和赋值操作符重载总是绑定在一起的。 一、几个问题 1、赋值操作符重载函数 参数为:const Test& obj,加上const的原因是我们不希望此函数对用来进行赋值的obj进行任何修改,其次加上const的形参,能接受const和非const的实参,反之只能接受非const的实参。 返回值为:Test&,返回值是返回被赋值着的引用,即*this,这样可以实现连续复制,类似 t2 = t1 = t3。如果...

qq_40467692的博客 537

C++操作符重载

在表达式中,我们常会用到各种操作符(运算符),例如1+3和4*2。然而,这些操作符只能用于C++内置的一些基本数据类型。如果我们自己编写一个复数类,它也会有加减法的操作,那么它能否摆脱一串冗长的函数名,而享用加号呢? 在第六章我们学到过,函数是可以重载的,即同名函数针对不同数据类型的参数实现类似的功能。在C++中,操作符也是可以重载的,同一操作符对于不同的自定义数据类型可以进行不同的操作。

703
下一篇: C++模板
rendaduiyan
博客等级 码龄21年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值