使用静态强制转换时,将类型或对象引用转换为更有意义吗?

时间:2016-02-15 23:26:00

标签: c++ static-cast

我刚刚意识到我可以使用其中任何一种来达到同样的效果。有什么警告吗?哪种惯例更有意义?

#include <iostream>

using namespace std;

class some_class {
public:
    void echo() {
        cout << 1 << endl;
    }
};

class other_class : public some_class {
public:
    void echo() {
        // Does it matter? 
        static_cast<some_class>(*this).echo();
        static_cast<some_class&>(*this).echo();
    }
};

int main() {
    other_class a;

    a.echo();

    return 0;
}

1 个答案:

答案 0 :(得分:3)

第一个强制转换创建一个some_class类型的临时对象,通过切片从*this初始化,然后在临时对象上调用echo,然后销毁临时对象。如果您将echo函数更新为some_class的成员变量,您会注意到*this实际上没有更新。

第二个演员在some_class::echo();对象上调用*this函数,而不创建任何内容。

通常,第二个选项是您的目标。正如davidhigh在评论中所指出的那样,简单地编写some_class::echo();而不是使用强制转换是一种更清晰的代码风格(恕我直言)。