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