6 执行期语义学 (Runtime Semantics)

有下面这个简单的式子:

if( yy == xx.getValue() )
    // ...

其中xx和yy定义为:

X xx;
Y yy;
// class Y的定义为:
class Y
{
public:
    Y();
    ~Y();
    bool operator==(const Y&) const;
};
// class X定义为:
class X
{
public:
    X();
    ~X();
    operator Y() const;        // conversion运算符:转换函数
    X getValue();
};

首先决定equality运算符所参考到的真正实例.在这个例子中,它将被决议(resolved)为"被overloaded 的Y成员实体"。下面是该式子的第一次转换:

// resolution of intended operator
if ( yy.operator==( xx.getValue() ) )
// ...

Y的==运算符需要一个类型为Y的参数,然而getValue()返回的却是一个类型为X的object,若非有什么方法可以把一个X object转换为一个Y object,那么这个式子就算错。本例中,X提供一个conversion函数,把一个X object转换为一个Y object.它必须施行于getValue()的返回值上. 下面是该式子的第二次转换:

// conversion of getValue()'s return value
if ( yy.operator==(xx.getValue().operator Y()) )
    // ...

到目前为止所发生的一切都是编译器根据 class 的隐含语意,对程序代码所做的"增胖"操作.如果需要,也可以明确地写出那样的式子。
虽然程序的语意是正确的,但其教育性却尚不能说是正确的。接下来必须产生一个临时对象,用来放置函数调用所传回的值:


X temp1 = xx.getValue();  // 产生一个临时 class X object,放置getValue()的返回值
Y temp2 = temp1.operator Y();  // 产生一个临时 class Y object,放置operator Y()返回值
int temp3 = yy.operator==(temp2);  // 产生一个临时 int object,放置equality运算符返回值

最后,适当的destructor将被施行于每一个临时性的 class object上,这导致式子被转换为以下形式:

// C++伪代码:以下是条件句 if (yy == xx.getValue()) ... 的转换
{
    X temp1 = xx.getValue();
    Y temp2 = temp1.operator Y();
    int temp3 = yy.operator==(temp2);

    if (temp3) // ...
    temp2.Y::~Y();
    temp1.X::~X();
}

似乎不少,这是C++的一件困难事情:不太容易从程序代码看出表达式的复杂度.本章看一看执行期所发生的一些转换.

posted @ 2021-04-24 15:28  点|滴  阅读(13)  评论(0)    收藏  举报