关于运算符重载(总结)

第四章 运算符重载之——运算符重载的概念 1、运算符重载就是给已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得运算符也能够用来操作对象。 2、C++允许重载大多数运算符,不允许重载的有: 成员访问运算符 . 成员指针访问运算符 .* 、 ->* 域运算符 : : 长度运算符 sizeof 条件运算符 ? : 预处理符 # 用于类运算的运算符通常都要重载, = 默认重载为成员变量的复制 & 默认重载为返回任何类对象的地址 3、运算符重载的实质是编写以运算符为名称的函数,使用 阅读详情

关于运算符重载(总结)

1、运算符重载是为了对用户自定义数据类型的数据的操作与内定义的数据类型的数据的操作形式一致。不能重载的5个运算符:*成员指针访问运算符;::域运算符;sizeof长度运算符;?:条件运算符;.成员访问符。

运算重载的三种方式:普通函数,友元函数,类成员函数。

当重载为成员函数时,双目运算符仅有一个参数。对单目运算符,重载为成员函数时,不能再显式说明参数。重载为成员函数时,总时隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。 

运算符重载函数还可以为友元函数。当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->。

原因:有人说是因为

C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。

不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员。而赋值运算符“=”是基于对象操作的。

当把赋值运算符重载为类的友员函数,在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择。

(1)因为它认为类中并没有重载赋值运算符的成员函数,所以它根据C++的规则,会去调用相应的构造函数。

(2)但是在全局里,我们已经重载了参数类型为此类类型的赋值运算符函数,而这赋值语句刚好和这函数匹配上了,根据C++的规则,也会去调用这函数。

程序是不允许有矛盾不确定选择的,所以当赋值运算符重载为类的友元函数时,编译器就会提示错误。

 

2、流运算符为什么不能重载为成员函数,只能用友元函数重载,cout<<obj;

 

cout << f1 << f2;

 //用重载运算符表示,只能通过友员来实现,如果要用成员函数,则会有cout.operator<<(const F& f),所以这是不可能的.因此只能用友员来实现,operator<<(cout,f) 而cout是ostream型的,因此有以下标准格式.注意不能加const,因为cout是要改变的,会改变里的缓冲成员.

friend ostream& operator<<( ostream& cout, constF&)  //输出运算符的标准重载格式.

friend istream& operator>>(istream& is, F& f){ }   //输入运算符重载标准格式

#include <iostream>  

using namespace std;  

class F{  

        int n;  

        int d;  

public :  

        F(int n=0, int d=1):n(n),d(d){}  

        friend ostream& operator<<(ostream& os, const F& f){  

                os << '[' <<  f.n << '/' << f.d <<']';  

                return os;  

        }  

        F operator*(const F& o) {  

                return F(n*o.n,d*o.d);  

        }  

        friend F operator/(const F& f1,const F& f2){  

                return F(f1.n/f2.d,f1.d/f2.n);  

        }  

        friend istream& operator>>(istream& is, F& f){  

                char ch;  

                is >> f.n >> ch >> f.d;  

                return is;  

        }  

};  

 

int main()   

{  

        F f1(3,5),f2(11,7),f;  

        cout << f1 << '*' << f2 << '=' << f1*f2 << endl;  

        cout << f1 << '/' << f2 << '=' << f1/f2 << endl;  

        cout << "Input 2 fractions :";  

        cin >> f1 >> f2;  

        cout <<"f1=" << f1 << endl;  

        cout << "f2=" << f2 << endl;  

} 

3、在类成员函数中重载运算符是不允许返回引用的,会出现“返回局部变量的地址”警告

4、把后++,后--当作双目运算符,第二个操作数是整形

单目运算符重载

-友元函数形式:返回类型 operatorX(形参)

使用:X obj ---> operatorX(obj);

-成员函数形式 尽量用成员:返回类型 operatorX(/*无形参*/)

使用: X obj ---> obj.operator();

#include <iostream>  

using namespace std;  

class A{  

        int data;  

public :  

        A(int d=0):data(d){}  

        friend ostream& operator<<(ostream& os,const A& a){  

        os << a.data;  

        return os;  

        }  

        friend istream& operator>>(istream& is,A& a){  

        is >> a.data;  

        return is;  

        }  

        friend A& operator++(A& a){  

                a.data += 10;  

                return a;  

        }  

        A& operator--(){  

                data -= 10;  

                return *this;  

        }  

        friend A/* 不能用引用 */ operator++(A& a,int){  

                A old(a);  

                a.data += 1;  

                return old;  

        }  

        A /* 不能用引用 */ operator--(int){  

                A old(*this);  

                data -= 1;  

                return old;  

        }  

};  

int main()  

{  

        A a1(50),a2(100);  

        cout << "a1=" <<a1 << endl;  

        cout << "a2=" <<a2 << endl;  

        cout << "++a1=" << ++a1 << endl;  

        cout << "--a1=" << --a1 << endl;  

        cout << "a1++=" << a1++ << endl;  

        cout << "a1=" <<a1 << endl;  

        cout << "a2--=" << a2-- << endl;  

        cout << "a2=" <<a2 << endl;  

 

} 

 

5、强制类型转换:类型(数据) --> (不必写返回类型,因为始终与后面的类 型是相同的) operator类型(无形参) 只能写成成员函数,不能是友员.

 

#include<iostream> 
using namespacestd; 

classA{ 
intdata; 
public: 
A(intd=0):data(d){} 
operator int(){ 
returndata; 
} 
operator bool(){ 
returndata!=0; 
} 
operator char(){ 
return(char)data; 
} 
}; 
intmain() 
{ 
A a1(65),a2(200); 
cout << "a1="<< (char)a1 << endl; 
intd=a2; 
if(a2) 
cout << "good"<< endl; 
}

c函数调用-不使用函数返回值 c函数调用-不使用函数返回值c函数调用-不使用函数返回值 立即下载

相关推荐

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1085

AWTK开发编译环境踩坑记录3(VS Code提示错误:不允许使用返回函数的函数C/C++(90))

AWTK开发编译环境踩坑记录3(VS Code提示错误:不允许使用返回函数的函数)

qasxc78563的博客 2195

【逆向实战】Unity游戏资源提取与解密全攻略:从AssetBundle到libil2cpp.so的破解技巧

本文详细介绍了Unity游戏资源提取与解密的完整流程,涵盖从AssetBundle到libil2cpp.so的破解技巧。通过AssetStudio和Il2CppDumper等工具,读者可以学习如何提取未加密资源、处理加密文件,并掌握动态dump技术。文章还提供了自动化脚本编写和常见问题解决方案,帮助逆向工程爱好者高效完成资源提取任务。

weixin_29012765的博客 1051

函数指针、指针函数类

函数指针例: type (*func)(type &,type &)   该语句声明了一个指针func,它指向了一个函数,这个函数带有了2个type型参数并返回一个type的值。 p.s. type类型可以被看成是int啊或者是floast等类型。 =============注意项==============1.一个指向函数的指针必须确保该函数被定义且分配了内存,否则它将指向一个空地址

非常懒的博主 758

网络摄像头(IPC)介绍:类型、供电、镜头、夜视等

IPC(Internet Protocol Camera,网络摄像头),它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。它可以将视频、音频、报警及控制信号通过网络传输,接受网络监控主机(NVR或监控管理平台)的管理。IPC可与路由器、交换机、NVR等设备组建成为监控系统。

学无止境,Fighting! 1万+

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors教程

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors

m0_69133594的博客 2837

c++返回函数指针的函数

返回函数指针的函数函数指针指针函数返回函数指针的函数 函数指针 类似于数组名,在C语言中函数名的实际就是函数所在空间的首地址,故也可声明相应类型的函数指针用于指向相应的实际函数,更深层次甚至可以声明函数指针数组和返回函数指针的函数 定义格式:声明函数指针时需要指出返回类型和所有形参类型,即对于指向int add(int a,int b);的函数指针可以声明为 int (*p)(int ,int ) = add; 这里的p即为指向add的函数指针,注意*p左右的括号不可省略,否则优先级原则p前面的*

来,骗!来,偷袭! 7642

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1468

运算符重载之友元运算符重载

友元可以参考:https://blog.youkuaiyun.com/aaqian1/article/details/84427884 友元运算符重载函数: 把运算符重载函数定义为某个类的友元函数。 1、定义友元运算符重载函数的语法形式 (1)在类的内部,定义友元运算符重载函数的格式如下: friend 函数类型 operator 运算符(形参表) { 函数体 } (2)友元运算符重载函数也可以在类中声明...

aaqian1的博客 1万+

GPU资源池化:技术原理与应用场景全解析

GPU资源池化技术已成为AI时代高效利用算力的关键方案。该技术通过硬件虚拟化、容器化编排和智能调度三个核心层面,实现GPU资源的共享与优化,可将平均利用率从不足30%提升至60-80%。主流方案包括NVIDIA全栈解决方案、云原生Kubernetes生态及开源工具,适用于企业AI平台、大模型训练和边缘推理等场景。虽然面临性能隔离、资源碎片等挑战,但随着硬件虚拟化细化和AI驱动调度算法的发展,GPU池化正向着智能化、自动化方向演进,推动实现"算力如水电"的愿景。

技术引领业务创新 1352

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

3.当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。2.RTMP协议中基本的数据单元称为消息(Message)。下载地址:http://nginx.org/download。下载 rtmp模块 到nginx 模块下。安装nginx 和 rtmp模块。(1). linux 环境准备。下载nginx安装包。使用 vcl 播放流。

weixin_45397344的博客 2278

C++运算符重载(类内、外重载)

1.概念   运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能。这个函数叫做运算符重载函数(常为类的成员函数)。 2.运算符重载的基本格式    返回值类型 类名::operator重载的运算符(参数表)    {    ……    }    operator是关键字,它与重载的运算符一起构成函数名。 3.运算符重载的两种方法 1.类内重载 #include <iostream> using namespa

u014583317的博客 7万+

【知识分享】CAN总线中终端网络的重要性

P沟道和N沟道晶体管的漏源通态电阻匹配良好时,形成的CANH和CANL信号匹配良好;如果驱动器的一半具有比另一半低得多的导通状态电阻,那么总线共模电压将从VCC/2的显性状态偏离,并回到VCC/2的隐性状态,这将导致每一次状态转换都会伴随着共模电压噪声,从而导致更高水平的传导和辐射能量发射。

一只豌豆象的博客 1547

运算符重载之成员运算符重载

成员运算符重载函数 成员运算符重载函数,即把运算符重载函数定义为某个类的成员函数。 1、定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表){ 函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义。 在类内,声明成员运算符重载函数原型的格式如下: class X{ 函数类型 operat...

aaqian1的博客 4556

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++——运算符重载

运算符重载:对数据类型已有的运算符重新进行定义赋予另一种功能,以适应不同的数据类型对于内置数据类型,编译器知道如何进行运算int a = 10;int b = 20;//计算机知道如何计算但是如果是两个自定义的类相加计算机就不知道如何计算,因为加号两边不是系统内置的数据结构。

头秃中。。。。。 4099

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

运算符重载———运算符重载的基本概念

引入运算符重载的目的: 由于C++预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型,导致对象无法通过运算符进行运算。故引入了运算符重载。 运算符重载: 1:运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。 2:运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。 3:运算符重载的实质是函数重载,可以重载为普通函数,也可以重载为成员函数 4:把含运算符的表达式转换成对运算符函数的调用。

qq_44923545的博客 7731

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

运算符重载

C++运算符重载详解

JJR_YZ的博客 2952

c++之运算符重载

前言 本篇文章主要写的是关于c++运算符重载的问题,运算符重载是c++中比较重要的概念。本篇文章用了大量的实例来说明c++运算符重载,因此文章的篇幅可能会比较大。 一、什么是运算符重载 在c++中我们都知道有函数重载的概念,在类和对象的设计中还设计到了成员函数重载。同样c++也提供了运算符的重载,所谓重载,就是赋予新的含义。实际上我们在前期的学习过程中已经不知不觉使用了运算符重载,如"<<“和”>>“本来是c++的位移运算符,但是却可以用来输入与输出,这是因为c++系统对”<&

weixin_44974029的博客 3671

重载学习——函数重载与运算符重载

一枚小新,有问题欢迎共同探讨~

weixin_62377025的博客 2674

函数重载和运算符重载

函数重载和运算符重载,实现了常见的==运算符、=运算符、+、+=运算符,

crawer 1546

【C++】运算符重载

本文讲解了 C++ 运算符重载的概念与用法,包括成员函数重载、友元函数重载、全局函数重载,以及对 ++、--、<<、>> 等特殊运算符的重载方式

weixin_56167571的博客 1690

C++ 运算符重载+赋值运算符重载

当运算符被用于类类型的对象时,C++ 语言允许我们通过运算符重载的形式指定新的含义。C++ 规定类类型对象使用运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。运算符重载是具有特殊名字的函数,他的名字是由 operator 和后面要定义的运算符共同构成。和其他函数一样,它也具有其返回类型和参数列表以及函数体。重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。

Jason_from_China的博客 1685

CPP运算符重载

文章目录函数的重载运算符重载运算符重载的作用运算符重载的方式典型运算符的重载转换构造函数类型转换函数 函数的重载 1.定义的重载函数必须具有不同的参数个数,或不同的参数类型。编译系统根据不同的参数去调用不同的重载函数,实现不同的功能。 2、仅返回值不同时,不能定义为重载函数。 运算符重载 函数重载是指完成不同功能的函数可以具有相同的函数名。 C++编译器根据函数的实参确定应该调用哪一个函数。 运算...

SongyangJi 3222
上一篇: c++ const限定符的使用
下一篇: c++构造函数再调用构造函数
programerchen
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值