第六章 執行期語意學(Runtime Semantics)
阿新 • • 發佈:2018-12-29
想象下簡單的式子:
if(yy == xx.getValue()) ...
//xx 和 yy的定義
X xx;
Y yy;
//Y定義
class Y
{
public:
Y();
~Y();
bool operator ==(const Y&) const;
//...
};
//X定義
class X
{
public:
X();
~X();
operator Y() const; //conversion運算子
X getValue();
//...
};
編譯器會將第一句簡單的式子展開成如下:
if(yy.operator == (xx.getValue().operator Y()))
這一切都是編譯器根據class的隱含語意,對我們的程式碼所做的增胖處理。如果我們需要,我們可以明確的寫那樣的式子。
雖然程式的語意是正確的,但是會產生臨時物件:
- 產生一個臨時的class X object,放置getValue()的返回值:
X temp1 = xx.getValue();
- 產生一個臨時class Y object,放置operator Y()的返回值:
Y temp1.operator Y();
- 產生一個臨時的int object,放置equality(等號)運算子的返回值:
int temp3 = yy.operator == (temp2);
最後,適當的destructor將被施行於每一個臨時的class object身上:
//C++ pseudo
//以下是條件if(yy == xx.getValue()) ...的轉換
{
X temp1 = xx.getValue();
Y temp2 = temp1.operator();
int temp3 = yy.operator == (temp2);
if(temp3) ...
temp2.Y::~Y();
temp1.X::~X();
}
這就是C++的一件困難的事情:不太容易從程式原始碼看出表示式的複雜程度。