C++中operator用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中operator用法相关的知识,希望对你有一定的参考价值。
C++中operator用法图中char什么意思 有什么用吗 operator前面加个
1.operator用于类型转换函数:类型转换函数的特征:1)型转换函数定义在源类中;2)须由operator修饰,函数名称是目标类型名或目标类名;3)函数没有参数,没有返回值,但是有return语句,在return语句中返回目标类型数据或调用目标类的构造函数。类型转换函数主要有两类:1)对象向基本数据类型转换:对象向不同类的对象的转换:例程1://通过类型转换函数求半径为5的圆的面积//并将其存储在float型变量中打印输出#includeusingnamespacestd;classCAreafloatarea;public:CArea()area=0;CArea(floata)//重载含有一个参数的构造函数area=a;voidgetArea()cout(constemployee&e)//重载大于号操作符if(salary>e.salary)returntrue;elsereturnfalse;;voidmain()employeeemp1,emp2;emp1.setSalary(1000);emp2.setSalary(2000);if(emp1>emp2)cout<<"emp1比emp2工资高"<<endl;elsecout<<"emlp1没有emp2工资高"<<endl; 参考技术A 意思是说这个运算式结束后,返回的值做为左值的时候是char类型的例:
string str = "abcdef";
str[1] = 'A'; //这时str[1],调用了operator[],它做为左值的时候是char类型
如果str[1] = 0.12; //这样就是错的
“operator !=”是不是应该在 C++ 中始终通过“operator ==”来实现?
【中文标题】“operator !=”是不是应该在 C++ 中始终通过“operator ==”来实现?【英文标题】:Should "operator !=" always be implemented via "operator ==" in C++?“operator !=”是否应该在 C++ 中始终通过“operator ==”来实现? 【发布时间】:2011-06-07 17:44:13 【问题描述】:我目前正在查看一个旧的 C++ 代码库,发现很多代码是这样的:
bool SomeClass::operator==( const SomeClass& other ) const
return member1 == other.member1 && member2 == other.member2;
bool SomeClass::operator!=( const SomeClass& other ) const
return member1 != other.member1 || member2 != other.member2;
很明显,比较逻辑是重复的,上面的代码可能需要在两个地方而不是一个地方进行更改。
AFAIK 实现operator!=
的典型方式是这样的:
bool SomeClass::operator!=( const SomeClass& other ) const
return !( *this == other );
在后一种情况下,无论operator==
发生什么逻辑变化,它都会自动反映在operator!=
中,因为它只是调用operator==
并执行否定。
除了在 C++ 代码中重用 operator==
之外,是否应该以任何其他方式实现 operator!=
?
【问题讨论】:
同样,应该尝试以最少冗余的方式实现>, >=, <=, <
运算符。
规则不应该是绝对的。所有规则普遍适用。但我相信总会有特定的情况,他们没有。但是想出一个(除非你昨天碰巧做到了)通常是不可能的(因为它们是规则的例外)。就像问的都是白天鹅。是的,所有天鹅都是白色的(直到 1500 年在澳大利亚发现黑天鹅)。 Ceaser: "rara avis in terris nigroque simillima cygno"
【参考方案1】:
恕我直言,在 == 方面实现 != 既合理又可靠。 (或相反)
【讨论】:
-1 表示错误的建议.. 你如何根据!=
实现==
?
@Nawaz:a==b iff !(a!=b)
。这是根据定义。【参考方案2】:
语义上是的(意味着 == 应该是 != 的逻辑补充),但实际上(编码)你不必这样做。
【讨论】:
我会在语义上说你不需要,但实际上你应该。 我的意思是 == 应该是 != 的语义补充,但实际上(在编程中)你不必用它来暗示否定。 你没有错或任何事情:)。只是看待事物的方式不同。当您说“实际”时,您关注的是 C++ 的规则,当我说“实际”时,我关注的是易于维护的模块化代码。不要过多阅读我的评论:)【参考方案3】:在大多数情况下a!=b
的语义应该等于!(a==b)
。
对于所有其他运算符也是如此:a<b
应该等于 !(a=>b)
和 !(a==b || a>b)
和 a<=b && !(a==b)
等等。
为此,boost.operators 提供了一些很棒的工具,可以根据其他工具自动生成运算符。
但是,当您为运算符提供一些特定语义时(即:您不使用 ==
来检查两个项目是否相同,而是使用 STL 对 >>
和 <<
进行一些花哨的操作) 你可能想给他们不同的实现。
通常不建议这种做法,尽管即使是 STL 和许多 boost 库也这样做。
编辑 - 一点补充:
到目前为止,我所说的仅涉及运算符的语义。如果你决定 a!=b
的语义应该是 !(a==b)
你有两种方法来实现它:
通过调用另一个运算符,如果您使用 boost.operators 会发生这种情况:bool operator!=(a,b) return !(a==b);
从头开始实现它们。
第一种方法通常更容易实现且更安全。可以证明第二个选项的最常见的事情是优化,尽管它可能不值得:现代编译器在大多数情况下不会增加任何开销(如果你查看 boost.operators 源代码,你会看到许多关于它们如何依靠NRVO 不会增加任何开销,或者如果编译器不提供 NRVO,它们的代码会如何变化)。
无论如何,无论您选择什么选项,它都不会对您的应用程序逻辑产生影响,因为重要的是语义(即:您的运算符的行为方式,它们为任何可能的输入返回什么)。
【讨论】:
+1 for Boost.Operators,令人惊讶的是,这个微型库如何让实现运算符变得如此简单。不仅您摆脱了依赖关系,而且您还摆脱了明显的错误(例如,在实现<=
时切换参数为 <
)。【参考方案4】:
除了在 C++ 代码中重用
operator==
之外,是否应该以任何其他方式实现operator!=
?
我不这么认为。但同样适用于其他代码,例如后缀++
应该总是 以前缀++
的形式实现(当然对于优化器可以生成更高效代码的原生类型除外,但我相信即使这样,参数仍然成立)和@987654325 @ 应该几乎总是按照operator +=
来实现(例外是当您使用代理对象来延迟执行时)。
这就是std::relops
存在的原因。
【讨论】:
以上是关于C++中operator用法的主要内容,如果未能解决你的问题,请参考以下文章