【问题标题】:Const method - repeat in implementation?Const 方法 - 在实现中重复?
【发布时间】:2016-11-06 02:00:36
【问题描述】:

我一直在寻找答案,但始终找不到。说我有:

class foobar{
  public:
     char foo() const;
};

,在我的 foobar.h 中

当我想在 foobar.cpp 中实现这个类时,我应该重复const吗?:

char foobar::foo() const{
//...my code
}

或者我可以做吗(没有const

char foobar::foo() {
//...my code
}

如果这是重复的,我很抱歉,但没有其他问题真正回答了这个问题。

【问题讨论】:

    标签: c++ class methods constants


    【解决方案1】:

    如果您的变量是 char foo() const; 并且您想要实现它,您必须将其命名为与您声明它的名称相同。

    char foobar::foo() const{
    //...my code
    }
    

    char foobar::foo();char foobar::foo() const; 不同。这意味着您可以在类声明中同时包含它们,例如:

    class foobar{
      public:
         char foo() const;
         char foo();
    };
    

    【讨论】:

      【解决方案2】:

      您绝对必须在实现中包含const 限定符。

      可以根据constness 重载函数。事实上,这是语言中非常重要的一部分。

      【讨论】:

      【解决方案3】:

      是的,你应该重复const,它是函数签名的一部分。也可以在没有const 修饰符的情况下进行另一个声明和实现。

      【讨论】:

      • 你能给我一个参考链接吗?
      【解决方案4】:

      是的,foobar.cpp 文件中必须需要 const 限定符。当您在方法签名中使用 const 时,您是在告诉编译器 this 指向的内存无法通过此方法更改(此处为 foobar)。

      【讨论】:

        【解决方案5】:

        是的,因为const 是签名的一部分。您可以定义两个仅在const-ness 上不同的成员函数。

        查看是否需要它的最简单方法是使用您喜欢的编译器测试您的代码 - 下面的代码将无法编译:

        struct foobar{
            char foo() const;
        };
        char foobar::foo() {
            return 'a';
        }
        int main() {
            foobar().foo();
            return 0;
        }
        

        你应该得到一个类似这样的错误:

        错误:'char foobar::foo()' 的原型与 'foobar' 类中的任何一个都不匹配

        char foobar::foo()
        

        Demo.

        【讨论】:

          【解决方案6】:

          是的,您必须在定义中包含const 限定符。 如果你写:

          class Foo
          {
          public:
              int f () const;
          };
          

          如果你写在实现文件中:

          int Foo::f () { /*...*/ }
          

          然后编译器会发出一个错误,指出类中没有签名为int f () 的函数。 如果你也将const 关键字放在你的实现文件中,它会起作用。

          可以根据对象constness 重载函数。 示例:

          class Foo
          {
          public:
              int foo ()       { std::cout << "non-const foo!" << std::endl; }
              int foo () const { std::cout << "const foo!" << std::endl; }
          };
          
          int main ()
          {
              Foo f;
              const Foo cf;
              f.foo ();
              cf.foo ();
          }
          

          输出将是(如预期的那样):

          non-const foo!

          const foo!

          正如我们对 const 所做的那样,您也可以基于对象 volatileness 重载函数。

          【讨论】:

          • 为什么同一个操作的输出会不同?
          • 对不起,我在代码中写了 'Foo cf' 而不是 'const Foo cf'。因此,对于 const 对象,将调用 const 函数,对于非常量对象,将调用非常量函数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-21
          • 2016-02-14
          • 1970-01-01
          • 2012-08-13
          相关资源
          最近更新 更多