1. 程式人生 > >第六章 執行期語意學(Runtime Semantics)

第六章 執行期語意學(Runtime Semantics)

想象下簡單的式子:

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++的一件困難的事情:不太容易從程式原始碼看出表示式的複雜程度。