问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

C++中的运算符重载,帮我详细介绍下

发布网友 发布时间:2022-05-01 12:50

我来回答

2个回答

热心网友 时间:2023-10-13 08:14

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。

一、运算符重载的作用

运算符重载为类的用户提供了更直观的接口,使类类型的对象也可以像普通变量一样进行运算符的表达式运算。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。

二、运算符重载的规则

(1)C++中的运算符除了少数几个以外,全部可以重载,而且只能重载已有的运算符。

可以重载的运算符有:

算术运算符:+,-,*,/,%,++,--;

  位操作运算符:&,|,~,^,<<,>>

  逻辑运算符:!,&&,||;

  比较运算符:<,>,>=,<=,==,!=;

  赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;

  其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。

不能重载的运算符只有5个:

类属关系运算符“.”,成员指针运算符“*”,作用域分辨符“::”,sizeof运算符和三目运算符“?:”。

(2)重载之后运算符的优先级和结合性都不变。

(3)四个“不能改变”

·不能改变运算符操作数的个数;

  ·不能改变运算符原有的优先级;

  ·不能改变运算符原有的结合性;

  ·不能改变运算符原有的语法结构。

(4)至少要有一个操作对象是自定义类型。

(5)重载的运算符含义必须清楚,不能有二义性。

三、运算符重载的2种方法

(1)运算符重载为成员函数

(a)对于双目运算符op,如果要重载op为某类的成员函数,使之能够实现表达式 k op t,其中k为A类的对象,则应当把op重载为A类的成员函数,该函数只有一个形参,形参的类型是t所属的类型。经过这样重载之后,表达式 k op t 就相当于函数调用k.operator op( t )

(b)对于前置单目运算符U(如负号“-”),若要重载U为类的成员函数,用来实现表达式

U oprd,其中oprd为A类的对象,则U应当重载为A类的成员函数,且该函数不带形参。经过重载之后,表达式U oprd 就相当于函数调用oprd.operator U()。

(b)后置运算符“++”和“--”,若要将它们重载为类的成员函数,用来实现表达式oprd++或oprd--,其中oprd为A类的对象,那么就应当重载这2个运算符为A类的成员函数,这时函数要带有一个整型(int)形参。重载之后,表达式 oprd ++ 和 oprd -- 就分别相当于函数调用oprd.operator ++(0) 和 oprd.operator --(0)。

(2)运算符重载为友元函数

(a)对于双目运算符op,如果它的一个操作数为类A的对象,就可以将op重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过这样的重载之后,表达式k op t就相当于函数调用operator op( k, t )

(b)对于前置单目运算符U(如负号“-”),若要实现表达式 U oprd 其中oprd为A类的对象,则U可以重载为A类的友元函数,函数的形参为A类的对象oprd。经过重载之后,表达式

U oprd 就相当于函数调用operator U( oprd )

(c)对于后置运算符“++”和“--”,如果要实现表达式 oprd ++ 或 oprd --, 其中oprd为A类的对象,那么运算符就可以重载为A类的友元函数,这时函数的形参有两个,一个是A类的对象oprd,另一个是整型(int)形参。第二个参数是用于与前置运算符函数相区别的。重载之后,表达式oprd ++ 和 oprd -- 就分别相当于函数调用operator ++ (oprd, 0)

和operator -- (oprd, 0)。

热心网友 时间:2023-10-13 08:15

这么懒呢…百度去呀…追问我知道 ,我已经查过好多 ,还有书本 ,就是看不懂,如果你能帮我分析更好

热心网友 时间:2023-10-13 08:14

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。

一、运算符重载的作用

运算符重载为类的用户提供了更直观的接口,使类类型的对象也可以像普通变量一样进行运算符的表达式运算。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。

二、运算符重载的规则

(1)C++中的运算符除了少数几个以外,全部可以重载,而且只能重载已有的运算符。

可以重载的运算符有:

算术运算符:+,-,*,/,%,++,--;

  位操作运算符:&,|,~,^,<<,>>

  逻辑运算符:!,&&,||;

  比较运算符:<,>,>=,<=,==,!=;

  赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;

  其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。

不能重载的运算符只有5个:

类属关系运算符“.”,成员指针运算符“*”,作用域分辨符“::”,sizeof运算符和三目运算符“?:”。

(2)重载之后运算符的优先级和结合性都不变。

(3)四个“不能改变”

·不能改变运算符操作数的个数;

  ·不能改变运算符原有的优先级;

  ·不能改变运算符原有的结合性;

  ·不能改变运算符原有的语法结构。

(4)至少要有一个操作对象是自定义类型。

(5)重载的运算符含义必须清楚,不能有二义性。

三、运算符重载的2种方法

(1)运算符重载为成员函数

(a)对于双目运算符op,如果要重载op为某类的成员函数,使之能够实现表达式 k op t,其中k为A类的对象,则应当把op重载为A类的成员函数,该函数只有一个形参,形参的类型是t所属的类型。经过这样重载之后,表达式 k op t 就相当于函数调用k.operator op( t )

(b)对于前置单目运算符U(如负号“-”),若要重载U为类的成员函数,用来实现表达式

U oprd,其中oprd为A类的对象,则U应当重载为A类的成员函数,且该函数不带形参。经过重载之后,表达式U oprd 就相当于函数调用oprd.operator U()。

(b)后置运算符“++”和“--”,若要将它们重载为类的成员函数,用来实现表达式oprd++或oprd--,其中oprd为A类的对象,那么就应当重载这2个运算符为A类的成员函数,这时函数要带有一个整型(int)形参。重载之后,表达式 oprd ++ 和 oprd -- 就分别相当于函数调用oprd.operator ++(0) 和 oprd.operator --(0)。

(2)运算符重载为友元函数

(a)对于双目运算符op,如果它的一个操作数为类A的对象,就可以将op重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过这样的重载之后,表达式k op t就相当于函数调用operator op( k, t )

(b)对于前置单目运算符U(如负号“-”),若要实现表达式 U oprd 其中oprd为A类的对象,则U可以重载为A类的友元函数,函数的形参为A类的对象oprd。经过重载之后,表达式

U oprd 就相当于函数调用operator U( oprd )

(c)对于后置运算符“++”和“--”,如果要实现表达式 oprd ++ 或 oprd --, 其中oprd为A类的对象,那么运算符就可以重载为A类的友元函数,这时函数的形参有两个,一个是A类的对象oprd,另一个是整型(int)形参。第二个参数是用于与前置运算符函数相区别的。重载之后,表达式oprd ++ 和 oprd -- 就分别相当于函数调用operator ++ (oprd, 0)

和operator -- (oprd, 0)。

热心网友 时间:2023-10-13 08:15

这么懒呢…百度去呀…追问我知道 ,我已经查过好多 ,还有书本 ,就是看不懂,如果你能帮我分析更好

C++中的运算符重载,帮我详细介绍下

运算符重载为类的用户提供了更直观的接口,使类类型的对象也可以像普通变量一样进行运算符的表达式运算。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。二、运算符重载的规则 (1)C++中的运算符除了少数几个以外,全部可以重载,而且只能重载已有的运算符。可以重载的运算符...

vc的一个运算符重载问题.

详细的看 http://www.pcdog.com/edu/cpp/2005/12/w057920.html --- d+=r-f;这句中,d,f都是double型,因此r势必要转换为double型,这是隐式转换,同样适用于你定义的“转换为double”的操作符重载。就是这个时候调用的函数operator double()。它的返回值减去f,然后加到d上。

C/C++重载运算符operator

C/C++中的运算符重载是通过改变运算符的行为来扩展语言功能的关键。在编译过程中,运算符优先级影响着表达式树的构建,编译前端有固定规则,后端则需考虑硬件差异的优化,是编译器复杂性的重要部分。重载运算符时,需注意参数限制,二元运算符必须有明确的左右操作数,不能像函数那样自由设置参数。比如,自...

C++运算符重载什么意思啊、、看不懂。。。麻烦说通俗点,3Q!

因为像<、>、==这些运算符在C++中已有定义,作为C++的标准的一部分,所以我们要重新定义他们的用法时,就要用重载,就是要使用operator关键字。例如有这么个类 class MyClass{ int n; string name; bool operator ==(MyClass a,MyClass b) { return a.n==b.n && a.name==b...

c++中运算符(\" << \")重载ostream&是什么意思

运算符重载,是对现有操作符使用于自定义用户类型的一种扩展,但具体的性质不能变,如<<表示流操作符左侧对象为流的本质不能变,+为两元操作符本质不能变,再如,对于->重载必须返回指针类型不可变!即,即使进行运算符重载,也只是有限自由!friend ostream & operator << (ostream &os, const C...

c++中运算符重载到底有什么好处,可以举例说明吗?

就我的理解 那些运算符本身功能是有限的 比如不能进行复数的加减 但是我们重载以后 就可以让它实数与实数相加,虚数与虚数相加,最后结果也是复数 还有字符串string里也有很多重载的地方,像两个字符串也可以相加,等等 重载的主要目的是,简洁易懂,原理上其实也是通过函数实现的,像a + b用add(a,b) ...

什么是运算符重载?

1. 运算符重载的作用是什么?它允许你为类的用户提供一个直觉的接口。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。重载的运算符是函数调用的语法修饰:class Fred { public:// ...};if 0 // 没有算符重载:Fred add(Fred, Fred);Fred mul(Fred, Fred);Fred ...

C++中运算符重载问题,分别说明下面const的作用以及为什么要用引用_百 ...

c.int* const fun3() //调用时 int * const pValue = fun2();//我们可以把fun2()看作成一个变量,即指针本身不可变。一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因...

VC 找原因(运算符重载)

k++)for(int n=0;n<j;n++)C.p[i*k+n]=*(p+k*i+n)+*(B.p+k*i+n);return C;} 这个函数结束的时候,会调用析构函数,将*P申请的空间释放掉,所以运行的时候会出错;将~Matrix (){ delete []p;} 中的 delete []p; 注释掉,即可正确运行,不过的另写已函数用于释放*P ...

运算符重载!!!

1.表达式:需要左值 2.函数返回:此数据类型没有赋值构造函数.3.函数调用:避免调用拷贝构造函数.4.特殊技巧:程序员故意将上述构造函数设置为non-public.故不能调用,所以只能靠引用了.不知道说得全不全,楼下继续.

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
孩子的冠姓权是怎么回事? 如何看待孩子冠姓权问题? 意定监护协议样本内容是什么? 自愿放弃监护权合同范本是怎样的? 放弃孩子监护权协议书怎么写? 自愿变更监护权协议书怎么写? 变更监护权协议书怎么写? 子女监护权变更协议范本是怎样的? 变更子女监护权协议书 宝诗龙Epure焦特普尔之蓝腕表:诠释极致经典 c++运算符重载的调用的具体规则是怎样的?谢谢 c语言,c++,哪些运算符不能重载? 运算符重载的原则是什么? 统计学中,对于调查问卷的多项选择如何分析 问卷信效度分析,其中有多项选择题,如何进行?还有重复测试的效度分析? 您好,我想咨询一下,如果一个问卷中有包含2到多选题,如何对该问卷进行信效度分析呢? 厕所下水道堵了,陕西西乡那有捅下水道的 调查问卷中多选的统计分析 西乡疏通厕所多少钱,西乡疏通下水道多少钱,西乡疏通 虾和黑木耳和香菇能一起包饺子吃吗? 调查问卷中多项选择的统计及分析方法 汉中西乡下水道,你好我家厨房下水道堵塞请问有什么办法疏通吗? 调查问卷中有多选题怎么做信度分析 qq登陆提示(错误码0*OOO60008) 对于问卷的多选题用spss中哪个分析 华为手机怎么打开个人热点分享的手机还是上不了网啊? 调查问卷中有多选题怎么录入数据后做信度分析? 小米手机在重庆市长寿区有保修点吗 重庆小米维修点有哪些? 在重庆江北步行街哪里有小米售后服务点 什么是C++重载? 运算符重载规则问题 C++语言对运算符重载规定了那些限制 C++里什么是运算符重载?在什么情况下用? 巴固产的正压式呼吸器多少钱一台 运算符重载减法运算符 上海正压式空气呼吸器价格大概多少?有什么注意特点吗? C++里重载了的运算符是否还保持原来的优先级别? 正压式空气呼吸器6.8L气瓶,充一罐要多少钱? c++运算符重载分类总结 正压式空气呼吸器怎么使用啊,它的价格是多少啊,哪里有卖的,谁能告诉我一下,谢谢! 运算符重载必须遵循哪些原则 关于C++重载运算符 买一批专业的呼吸器,大家有没有什么好用的正压式呼吸器推荐? 如何制定婴儿喂养时间表 科学喂养 喂奶时间应该按开始 新生儿喂奶时间和量 新生儿记录吃奶时间。从开始记录还是吃完结束 婴儿吃奶次数及时间 国家规定喂奶时间多久
  • 焦点

最新推荐

猜你喜欢

热门推荐