返回值int&的区别和const int&

时间:2015-07-11 19:29:49

标签: c++ const

我有两个功能。

int& abc()
const int& abc() const

这两个功能有什么区别?我有一个内部类的源代码,其中定义了这两个函数。 Aren这两个函数是否含糊不清,因为它们具有确切的定义?这两者究竟有什么区别?

2 个答案:

答案 0 :(得分:3)

这是一个简单的程序,展示了两者之间的区别:

#include <iostream>

using namespace std;

class Foo {
    int c;
    public:
    Foo() {
        c = 1;
    }
    int abc() {
        c++;
        cout << "non-const, c = " << c << endl;
        return c;
    }

    const int& abc() const {
        //c++; // compile-error, can't modify in a const function
        cout << "const, c = " << c << endl;
        return c;
    }
};

int main() {
    const Foo foo1;
    Foo foo2;

    int a = foo1.abc();
    int b = foo2.abc();

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    a++; b++;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    cout << foo1.abc() << endl;
    cout << foo2.abc() << endl;
}

输出

const, c = 1
non-const, c = 2
a = 1
b = 2
a = 2
b = 3
const, c = 1
1
non-const, c = 3
3

允许第一个函数修改成员变量c,而第二个函数不能。根据{{​​1}}资格调用调用适当的函数。

通常会有一个与const限定版本配对的功能。例如,请参阅const的{​​{3}}。

答案 1 :(得分:0)

成员函数的const可以重载。因此,第二个成员函数重载第一个成员函数。它们的功能不同。一个是const而另一个不是。 当您声明类的常量对象时,这很有用。常量对象只能访问const成员函数。所以,你有一个为这种情况声明的const成员函数。

class MyClass {
    int nr;
    public:
       MyClass (int value) : nr (value) {}
       int& getNr () {return nr;} // this will be called by a non constant obj
       conts int& getNr () const {return nr;} // this one will be 
          // called by a constant object
}

int main () {
    MyClass foo (1);
    const MyClass bar (2);

    // Here int& getNr () {} will be called
    cout << foo.getNr () << endl; 

    // And here const int& getNr () const {} will be called
    cout << bar.getNr () << endl;

    return 0;
}