为什么我不能将此成员函数标记为const?

时间:2014-11-30 04:45:37

标签: c++ const member-functions

当我尝试编译这个简短的程序时:

#include <iostream>

class Foo {

public:
    friend int getX() const;

private:
    int x;
};

int Foo::getX() const { return this->x; }

int main() {
    Foo foo;
    std::cout << foo.getX() << std::endl;
}

我收到这些错误:

C:\>gcc test.cpp
test.cpp:6:23: error: non-member function 'int getX()' cannot have cv-qualifier
     friend int getX() const;
                       ^
test.cpp:12:17: error: no 'int Foo::getX() const' member function declared in cl
ass 'Foo'
 int Foo::getX() const { return this->x; }
                 ^
test.cpp: In function 'int main()':
test.cpp:16:22: error: 'class Foo' has no member named 'getX'
     std::cout << foo.getX() << std::endl;
                      ^

为什么我不能在此getX()标记const?它没有修改Foo的状态或任何内容,所以我应该能够这样做。

3 个答案:

答案 0 :(得分:2)

您正在使用friendconst声明功能。将两者放在一起是没有意义的:friend成员函数没有意义,因为成员函数已经可以访问类的私有部分。 const成员函数没有意义,因为他们没有固有的对象可以保证不会修改。

答案 1 :(得分:1)

问题在于您的friend声明。它没有声明该类的成员,它声明一个外部非成员函数是该类的朋友。非成员函数不能声明为const。这就是第一个编译器错误抱怨的内容。第二个编译器错误是由于您声明友谊而不是成员,因此成员正文的定义语法无效 - 没有声明成员,因此您无法定义成员的主体。

您正在尝试创建成员方法,因此您需要删除friend说明符(没有理由将成员声明为朋友):

class Foo {

public:
    int getX() const;

private:
    int x;
};

答案 2 :(得分:1)

朋友函数无权访问thisthis只能作为该类成员的函数访问。 {{1}}引用该类的特定实例,并且本质上的友元函数虽然在类文件中定义,但不是成员函数。