6

我正在通过面试问题寻找初级 C++ 开发人员职位。问题是(引用):

下面的代码是否正确

struct Foo
{
    int i;
    void foo ( void ) const
    {
        Foo* pointer = const_cast<Foo*>(this);
        pointer->i = 0;
    }
};

我会回答:

代码本身根据 C++03 和 c++11 标准是有效的,并且会成功编译。但它可能会在赋值指针->i = 0期间调用未定义的行为;如果调用foo()的类的实例被声明为const

我的意思是以下代码将成功编译并导致未定义的行为。

struct Foo
{
    int i;
    Foo ( void )
    {

    }
    void foo ( void ) const
    {
        Foo* pointer = const_cast<Foo*>(this);
        pointer->i = 0;
    }
};

int main ( void )
{
    Foo foo1;
    foo1.foo();   // Ok

    const Foo foo2;
    foo2.foo();   // UB

    return 0;
}

我的答案是正确的还是我遗漏了什么?谢谢你。

4

3 回答 3

5

我首先要问他们对“正确”的模棱两可的定义是什么意思。您需要了解程序的规范及其预期行为

正如您所说,如果他们只是询问它是否编译,那么答案是“是”。但是,如果他们确定正确是安全的,那么您可以讨论您在问题中陈述的事实。

通过这种方式回答,面试的人可以看到你是如何分析你被问到的,而不是直接回答,在我看来这是一件好事。

于 2013-07-24T12:20:59.430 回答
1

这段代码在法律上可能是正确的,但我想,这个问题的目的是确定你是否理解 const 本身的概念。因为,在语义级别上,您有一个函数采用隐式 const 对象指针,然后它会对其进行修改,这几乎可以肯定是一个错误。

在某些情况下,可能需要这样做(因为修改是一些返回值的缓存,或者不会改变对象语义值的类似操作),您可以使用mutable相关变量的关键字。

于 2013-07-24T12:16:52.880 回答
0

作弊的编译器将承担后果。

struct Foo
{
    int i;

    Foo(int a):i(a){}

    void foo ( void ) const
    {
        Foo* pointer = const_cast<Foo*>(this);
        pointer->i = 0;
    }

    bool operator<(const Foo& rhs) const{
        return i<rhs.i;
    }
};

#include <map>

int main ( void )
{
    std::map<Foo,int> kk;

    for(int i=0;i<10;++i){
        kk.insert(std::make_pair(Foo(i),i));
    }

    std::map<Foo,int>::iterator ite = kk.find(Foo(4));
    const Foo& foo4 = ite->first;
    foo4.foo();

    ite = kk.find(Foo(4));
    const Foo& tmp = ite->first; // crack

    return 0;
}

程序将在“const Foo& tmp = ite->first;”处破解

于 2013-07-24T13:09:13.300 回答