計(jì)算順序混亂
C和C++運(yùn)算符的先后順序,使你能夠知道怎樣計(jì)算諸如下列表達(dá)式:
a = b * c + d;
然而先后次序不會(huì)影響子表達(dá)式的計(jì)算順序。讓我們以看上去不重要的方式改變示例的表達(dá)式:
a = b() * c() + d();
現(xiàn)在的問(wèn)題是,在這個(gè)表達(dá)式中以什么樣的順序調(diào)用函數(shù)b(),c()和d()?答案是,順序是完全不確定的。更糟的是,順序不能借助圓括號(hào)的使用而確定。所以下列表達(dá)式?jīng)]有作用:
a = (b() * c()) + d();
函數(shù)計(jì)算順序通常不值得去關(guān)心。然而,假如這些函數(shù)有副作用,以某種方式彼此影響(稱(chēng)為相互副作用),那么順序就是重要的了。例如,假如這些函數(shù)改變相同的全局變量,則結(jié)果就是不同的,這取決于其中函數(shù)被調(diào)用的順序。
甚至當(dāng)不涉及函數(shù)調(diào)用時(shí),相互副作用也會(huì)產(chǎn)生影響:
int nI = 0;
cout《“nA[0]=”<這個(gè)表達(dá)式的問(wèn)題是單個(gè)表達(dá)式包含有相互副作用的兩個(gè)子表達(dá)式--變量nI是增量。哪個(gè)nA[nI++]首先被執(zhí)行,左邊的nA[nI++]還是右邊的nA[nI++]?沒(méi)法說(shuō),上述代碼可能會(huì)以預(yù)期的方式工作,但也可能不會(huì)。
說(shuō)明虛擬成員函數(shù)
為了在子類(lèi)中重載虛擬成員函數(shù),必須用和基本類(lèi)中函數(shù)一樣的形式說(shuō)明子類(lèi)中函數(shù)的參數(shù)和返回類(lèi)型。這并不總是清楚的。例如,下列代碼似乎講得通:
class Base
{
public:
virtual void AFunc(Base *pB);
};
class Subclass:public Base
{
public:
virtual void AFunc(Subclass *pS);
};
這個(gè)代碼會(huì)編譯通過(guò),但不會(huì)有遲后聯(lián)編。函數(shù)Base::AFunc()的參數(shù)是Base*類(lèi)型的,而函數(shù)Subclass::AFunc()的參數(shù)是Subclass*,它們是不同的。
這個(gè)規(guī)則的唯一例外是下面的例子,它符合ANSI C++標(biāo)準(zhǔn):
class Base
{
public:
virtual void Base* AFunc();
};
class Subclass:public Base
{
public:
virtual void Subclass* AFunc();
};
在此例中,每個(gè)函數(shù)返回其固有類(lèi)型對(duì)象的地址。這種技術(shù)很通用,所以標(biāo)準(zhǔn)委員會(huì)決定承認(rèn)它。
相關(guān)推薦:計(jì)算機(jī)技術(shù)與軟件專(zhuān)業(yè)技術(shù)資格(水平)考試官網(wǎng)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |