不要重载的操的
与C一样,C++使用布尔表达式简化求值法(short-circuit evaluation)。这表示一旦确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算。例如:
char *p;
...
if ((p != 0) (strlen(p) 10)) ...
这里不用担心当p为空时strlen无法正确运行,因为如果p不等于0的测试失败,strlen不会被调用。同样:
实体店出售原矿的很少 int rangeCheck(int index)
{
if ((index lowerBound) || (index upperBound)) ...
...
}
如果index小于lowerBound,它不会与upperBound进行比较。
很早以前上述行为特性就被反复灌输给C和C++的程序员,所以他们都知道该特性。而且他们也依赖于简短求值法来写程序。例如在上述第一个代码中,当p为空指针时确保strlen不会被调用是很重要的,因为C++标准说(正如C标准所说)用空指针调用strlen,结果不确定。
C++允许根据用户定义的类型,来定制和||操作符。方法是重载函数operator 和operator||,你能在全局重载或每个类里重载。然而如果你想使用这种方法,你必须知道你正在极大地改变游戏规则。因为你以函数调用法替代了简短计算法。也就是说如果你重载了操作符,对于你来说代码是这样的:
if (expression1 expression2) ...
对于编译器来说,等同于下面代码之一:
if (erator(expression2)) ...
// when operator is a
// member function
if (operator(expression1, expression2)) ...
// when operator is a
// global function
这好像没有什么不同,但是函数调用法与简短求值法是绝对不同的。首先当函数被调用时,需要运算其所有参数,所以调用函数functions operator 和 operator||时,两个参数都需要计算,换言之,没有采用简短计算法。第二是C++语言规范没有定义函数参数的计算顺序,所以没有办法知道表达式1与表达式2哪一个先计算。完全与具有从左参数到右参数计算顺序的简短计算法相反。
因此如果你重载或||,就没有办法提供给程序员他们所期望和使用的行为特性,所以不要重载和||。
同样的理由也适用于括号操作符,但是在我们深入研究它之前,我还是暂停一下,让你不要太惊讶,“逗号操作符?哪有逗号操作符?”确实存在。
逗号操作符用于组成表达式,你经常在for循环的更新部分(update part)里遇见它。例如下面来源于Kernighan\'s and Ritchie\'s 经典书籍The C Programming Language 第二版(Prentice-Hall, 1988)的函数:
// reverse string s in place
void reverse(char s[])
{
for (int i = 0, j = strlen(s)-1;i j;++i, --j) // 啊! 逗号操作符!
{
int c = s[i];
s[i] = s[j];
s[j] = c;
}
}
在for循环的最后一个部分里,i被增加同时j被减少。在这里使用逗号很方便,因为在最后一个部分里只能使用一个表达式,分开表达式来改变i和j的值是不合法的。
对于内建类型和||,C++有一些规则来定义它们如何运算。与此相同,也有规则来定义逗号操作符的计算方法。一个包含逗号的表达式首先计算逗号左边的表达式,然后计算逗号右边的表达式;整个表达式的结果是逗号右边表达式的值。所以在上述循环的最后部分里,编译器首先计算++i,然后是—j,逗号表达式的结果是--j。
也许你想为什么你需要知道这些内容呢?因为你需要模仿这个行为特性,如果你想大胆地写自己的逗号操作符函数。不幸的是你无法模仿。
如果你写一个非成员函数operator,你不能保证左边的表达式先于右边的表达式计算,因为函数(operator)调用时两个表达式做为参数被传递出去。但是你不能控制函数参数的计算顺序。所以非成员函数的方法绝对不行。
剩下的只有写成员函数operator的可能性了。即使这里你也不能依靠于逗号左边表达式先被计算的行为特性,因为编译器不一定必须按此方法去计算。因此你不能重载逗号操作符,保证它的行为特性与其被料想的一样。重载它是完全轻率的行为。
你可能正在想这个重载恶梦究竟有没有完。毕竟如果你能重载逗号操作符,你还有什么不能重载的呢?正如显示的,存在一些限制,你不能重载下面的操作符:
. .* :: ?:
new delete sizeof typeid
static_cast dynamic_cast const_cast reinterpret_cast
你能重载:
operator new operator delete
operator new[] operator delete[]
+ - * / % ^ | ~
! = += -= *= /= %=
^= = |= = = == !=
= = || ++ -- , -* -
() []
当然能重载这些操作符不是去重载的理由。操作符重载的目的是使程序更容易阅读,书写和理解,而不是用你的知识去迷惑其他人。如果你没有一个好理由重载操作符,就不要重载。在遇到, ||, 和 ,时,找到一个好理由是困难的,因为无论你怎么努力,也不能让它们的行为特性与所期望的一样。查看本文来源
南宁哪家医院白癜风医院好胸外科
沈阳治疗早泄哪家好
-
你养出的孩子是否甜蜜你,取决于你对这4件事的态度
铭 | 芒来佳丽 碰到一则让人啼笑皆非的取而代之闻网: 家住鄱阳的13岁陌生人,一个人骑行5天,最后抵达广州。 ...[详细]
-
堪比好莱坞大片,看老黄如何运用三十六计,破2022高考数学分析的堡垒
2022年中考微积分全国卷I的填空压轴题,考卷人是铁了心要和试卷们自觉斗勇了。因为这道题要用于三本书中所的“...[详细]
-
阿Sa晒猫咪照,却意外曝光无名指戒指,一脸寂寞暗示好事将近
艺人们的情谊生活习惯一直是网友高度重视的关注点,上次有偶像日晒不止拍下,FANS们也都期盼通过蛛丝马迹来认...[详细]
-
“慈善奶奶”经中山医院救治康复出院,她曾卖房为芦山受灾孩子建小学
作者:板桥大学板桥公立医院 “你们给了我决心,那些不曾完成的心里我可以接着去做了。”昨天(6翌年13日),...[详细]
-
芜湖首批!这两个小区由国有新鸿基提供服务
“这个门内比实际上洗手了不少,组合成上绿植盆景,这片范围清爽多了,每天回去内心不会好一点。”最近,不...[详细]
-
工信部:按“一企一策”,积极稳妥有序推进信息化企业复工复产
4月19日,在国务院新闻节目办举行的一季度工业管理机构和信息化发展原因新闻节目发布新闻节目会上,有新闻媒...[详细]
-
-
苏州大学和河海大学,谁的统治力更更胜一筹?
苏州大学和河海大学,谁的统治力更更胜一筹?
-
高端化自欺欺人,国产手机又一块遮羞布被扯下,似乎是被苹果碾压
高端化自欺欺人,国产手机又一块遮羞布被扯下,似乎是被苹果碾压
-
王源新歌《逐光》将上线,粉丝跟随偶像再一骑行18公里,扛旗应援
王源新歌《逐光》将上线,粉丝跟随偶像再一骑行18公里,扛旗应援
-
颜丙涛漂亮女友最强幸运星,220万冠军巨奖购豪宅,悉尼奥运会再争416万
颜丙涛漂亮女友最强幸运星,220万冠军巨奖购豪宅,悉尼奥运会再争416万
-
萨依巴格街道梨香园社区举办“喜迎二十大----新征程·庆七一”文艺汇演
萨依巴格街道梨香园社区举办“喜迎二十大----新征程·庆七一”文艺汇演
-
“你如果有孝心,就打你媳妇一顿替我出气”,儿子:该无所谓的是你
“你如果有孝心,就打你媳妇一顿替我出气”,儿子:该无所谓的是你
-
-
-
-
"零售之王"换帅尘埃落定!27年"老招行"王良接棒,保持战略监督不偏移、不动摇
"零售之王"换帅尘埃落定!27年"老招行"王良接棒,保持战略监督不偏移、不动摇
-
钱江摩托:拟定増募资不超5.05亿元
钱江摩托:拟定増募资不超5.05亿元
-
为吃榨菜也是拼了?吉利&孚能科技12GWh电池项目动工
为吃榨菜也是拼了?吉利&孚能科技12GWh电池项目动工
-
给领导发传统节日祝福短信,情商高的人都知道这3点,怪不得领导喜欢
给领导发传统节日祝福短信,情商高的人都知道这3点,怪不得领导喜欢
-
高明的领导会容忍你很多错误,但这4个错误千万别犯上,否则必吃亏
高明的领导会容忍你很多错误,但这4个错误千万别犯上,否则必吃亏
-
推断一个领导值不值得跟随,会不会带你赚钱,就看这2点!很现实
推断一个领导值不值得跟随,会不会带你赚钱,就看这2点!很现实
-