计算顺序混乱
C和C++运算符的先后顺序,使你能够知道怎样计算诸如下列表达式:
a = b * c + d;
然而先后次序不会影响子表达式的计算顺序。让我们以看上去不重要的方式改变示例的表达式:
a = b() * c() + d();
现在的问题是,在这个表达式中以什么样的顺序调用函数b(),c()和d()?答案是,顺序是完全不确定的。更糟的是,顺序不能借助圆括号的使用而确定。所以下列表达式没有作用:
a = (b() * c()) + d();
函数计算顺序通常不值得去关心。然而,假如这些函数有副作用,以某种方式彼此影响(称为相互副作用),那么顺序就是重要的了。例如,假如这些函数改变相同的全局变量,则结果就是不同的,这取决于其中函数被调用的顺序。
甚至当不涉及函数调用时,相互副作用也会产生影响:
int nI = 0;
cout《“nA[0]=”<这个表达式的问题是单个表达式包含有相互副作用的两个子表达式--变量nI是增量。哪个nA[nI++]首先被执行,左边的nA[nI++]还是右边的nA[nI++]?没法说,上述代码可能会以预期的方式工作,但也可能不会。
说明虚拟成员函数
为了在子类中重载虚拟成员函数,必须用和基本类中函数一样的形式说明子类中函数的参数和返回类型。这并不总是清楚的。例如,下列代码似乎讲得通:
class Base
{
public:
virtual void AFunc(Base *pB);
};
class Subclass:public Base
{
public:
virtual void AFunc(Subclass *pS);
};
这个代码会编译通过,但不会有迟后联编。函数Base::AFunc()的参数是Base*类型的,而函数Subclass::AFunc()的参数是Subclass*,它们是不同的。
这个规则的唯一例外是下面的例子,它符合ANSI C++标准:
class Base
{
public:
virtual void Base* AFunc();
};
class Subclass:public Base
{
public:
virtual void Subclass* AFunc();
};
在此例中,每个函数返回其固有类型对象的地址。这种技术很通用,所以标准委员会决定承认它。
相关推荐:北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |