2009-08-05 65 views
0

对我感兴趣我的职位之一的评论:编译器如何确定哪些成员函数发生了变异?

Me too。我也给访问者/ mutators相同的名字。

我在想这件事,因为我总是用setBar(int bar)代替名字相同的mutator。我想知道:编译器可以根据const标识符确定在运行时发生了什么变化,还是可以使用相同的函数名称,因为它有一个参数?

请问这种编译罚款:

class Foo 
{ 
    int bar_; 

    public: 
     int bar() { return bar_; } 
     void bar(int bar) { bar_ = bar; } 
} 

还是我必须这样做(我知道我应该反正这样做,只是我在这个运行):

int bar() const { return bar_; } 

我不不知道哪个是哪个。 Const的正确性很重要,所以我想我会希望编译器反对重载,因为一个变异而另一个不变。

它为什么这样工作?

+0

您的代码格式不正确。它应该看起来像int bar()const {return bar_; } 我猜。返回类型在代码中丢失。 – 2009-08-05 04:52:50

+0

你看过我的整篇文章,还是只是想让我失望? =( – jkeys 2009-08-05 05:21:26

回答

4

编译器首先看到的是传递给函数的参数的数量和类型。在需要查看const -ness之前,这解决了bar上的过载问题。

如果你失败了,以纪念bar()const,编译器会告诉你这第一次尝试调用bar()物体的const实例。

2

编译器不会阻止您编写实际上不会改变对象的非const成员函数。这并不违反常量正确性,只能确保对象不会通过const引用进行变异。这里的原则是const说函数可能不会变异,非const意味着函数可以随意变异,如果它想。没有办法承诺mutate,并让编译器强制执行:我认为这将太过于模糊以保证对调用者有任何用处。

正如Greg所说,当你试图在一个const对象上调用一个非const成员函数时,编译器会反对(同样,它实际上是否发生了变化并不重要,唯一重要的是它是否被声明为const)。

0

为了更容易理解,考虑到编译器假定如果将为该对象调用非const方法,则该对象将被更改。

因此,在一个const方法中,如果您为其中一个数据成员或该类的另一个非const方法调用非const方法,则编译器将发出错误信号。 (我知道,你可以将一些操作符定义为朋友函数,而不是方法,但是为了简化...)。例如,赋值运算符(operator =)默认为非const。这意味着,如果你这样做

void MyClass::MyConstMethod() const 
{ 
    classMember = value; 
} 

编译器会认为你叫classMember,其中,内部一个const方法是一个const对象的赋值操作符。由于operator =不是const,因此会报告编译器错误。

相关问题