c++ 常量方法-是否在实现中重复?

e37o9pze  于 2023-03-14  发布在  其他
关注(0)|答案(6)|浏览(148)

我一直在寻找一个答案,但始终找不到。假设我找到了:

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

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

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

或者我可以这样做(whitout的const

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

如果这是一个副本,我很抱歉,但没有其他问题真正回答了这个问题。

bjg7j2ky

bjg7j2ky1#

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

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

在实现文件中,如果您写入:

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

那么编译器会发出一个错误消息,指出类中没有签名为int f ()的函数,如果你在实现文件中也加入了const关键字,它就会工作。
可以根据对象const ness重载函数。例如:

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所做的那样,您也可以基于对象volatile ness重载函数。

v9tzhpje

v9tzhpje2#

您绝对 * 必须 * 在实现中包含const限定符。
可以根据const属性重载函数,实际上这是语言的一个重要部分。

41zrol4v

41zrol4v3#

是的,因为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.

7y4bm7vi

7y4bm7vi4#

是的,你应该重复const,它是函数签名的一部分。也可以有另一个声明和实现而不使用const修饰符。

eqfvzcg8

eqfvzcg85#

如果你的变量是char foo() const;,并且你想实现它,你必须把它命名为你声明的那样。

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

char foobar::foo();char foobar::foo() const;不同,这意味着您可以在类声明中同时使用它们,如下所示:

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

gdrx4gfi6#

是的,在foobar.cpp文件中必须需要const限定符。当你在方法签名中使用const时,你是在告诉编译器this指向的内存不能被这个方法改变(这里是foobar)。

相关问题