我的信息发表了评论我感兴趣的:

  

我也是。我也给访问器/增变器的名称相同。

我想知道这一点,因为我一直用setBar(int bar)而不是一个名为同样的事情突变的。我想知道:可以在编译器确定此基础上可以使用哪些变异在运行时,或者同样的功能名称,因为它有一个参数一个const标识符

将这个细编译:

class Foo
{
   int bar_;

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

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

int bar() const { return bar_; }

我不知道哪个是哪个。 const正确性是非常重要的,所以我想我会希望编译反对超载,因为一个发生变异,另外一个没有。

为什么它这样工作?

有帮助吗?

解决方案

编译器看的第一件事是要传递给函数的参数的数量和类型。这解决上bar所述过载之前甚至需要查看const岬。

如果你失败了,以纪念bar()const,编译器会告诉你这第一次尝试呼吁对象的bar()实例const

其他提示

,编译器将不会影响你写这实际上不发生变异的对象的非const成员函数。这不是违反常量,正确性,只保证对象不会通过常量引用突变的。这里的原则是常量说,功能可能发生变异,以及非const表示该功能是免费的,如果它要发生变异。有没有办法答应变异,并有编译器强制执行。我认为这将是过于模糊,是任何使用呼叫者的保障

由于格雷格说,当你尝试调用一个const对象的非const成员函数,编译器将对象(再次,它无关紧要是否实际上发生变异,唯一重要的是,无论是声明为const)。

有关的更容易理解,考虑编译器假定的对象将被改变,如果一个非const方法将被调用该对象。

因此,在一个const方法,如果调用一个非const方法用于数据成员中的一个或另一个类的非const的方法,所述编译器将发出错误信号。

您可以考虑运营商的方法,以及(我知道,你可以定义一些运营商如友元函数,而不是方法,而是simplifcation ...)。例如,赋值运算符(运算符=)是默认非const。这意味着,如果你做的东西像

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

编译器将认为你打电话classMember,其中,内部一个const方法是const对象的赋值运算符。由于操纵者=不是const的,将报告一个编译错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top