MoreEffectiveC++:不要重载的操作符

MoreEffectiveC++:不要重载的操作符,第1张

MoreEffectiveC++:不要重载的操作符,第2张

像C一样,C++使用布尔表达式来简化计算(短路计算)。这意味着一旦确定了布尔表达式的真值和假值,即使有些表达式还没有测试,布尔表达式也会停止运算。例如:

char * p;
...

如果((p!= 0) && (strlen(p) > 10))...

这里不用担心p为空时strlen无法正确运行,因为如果p不等于0的测试失败,strlen不会被调用。类似地:

int range check(int index)
{
if((index <下限)|| (index >上限))...
...
}

如果index小于lowerBound,则不会与upperBound进行比较。

很久以前,上述行为特征就被反复灌输给C和C++程序员,所以他们都知道这个特性。而且他们也是靠短求值法来写程序的。例如,在上面的第一段代码中,确保当p是空指针时不会调用strlen是很重要的,因为C++标准说(正如C标准所说)strlen是用空指针调用的,结果是不确定的。

++C允许根据用户定义的类型定制& &和||运算符。方法是重载函数operator&&和operator||,可以全局重载或在每个类中重载。但是,如果你想用这种方法,你必须知道你正在极大地改变游戏规则。因为你用函数调用方法代替了短计算方法。也就是说,如果你重载了操作符&&,你的代码看起来是这样的:

if(表达式1和表达式2)...

对于编译器,它相当于以下代码之一:

if(表达式1 .运算符&&(表达式2))...
//当运算符&&是
//成员函数
if(运算符&&(表达式1,表达式2))...
//当运算符&&是
//全局函数时

看起来没什么区别,但是函数调用方法和短求值方法绝对不一样。第一,调用一个函数时,需要计算它的所有参数,所以调用函数operator&&和operator||时,两个参数都需要计算,换句话说,不采用短计算方法。其次,C++语言规范没有定义函数参数的计算顺序,所以没有办法知道表达式1和表达式2哪个先计算。与计算顺序从左参数到右参数的短计算方法完全相反。

所以如果重载& &或者||,就没有办法给程序员提供他们所期望和使用的行为特征,所以不要重载& &和||。

同样的道理也适用于括号操作符,但是在我们深入研究它之前,我想暂停一下,让您不要太惊讶。“逗号运算符?逗号运算符在哪里?”它确实存在。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » MoreEffectiveC++:不要重载的操作符

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情