编译器如何决定调用哪个函数?

时间:2012-04-21 14:25:29

标签: c++ const overloading

假设String类中有两个重载的成员函数(const版本和非const版本):

char & String::operator[](int i)         //Version 1
{
    cout<<"char & String::operator[](int i) get invoked."<<std::endl;
    return str[i];
}


const char & String::operator[](int i) const       //Version 2
{

    cout<<"const char & String::operator[](int i) const get invoked."<<std::endl;
    return str[i];
}

并且有一个测试代码片段

int main(){
    String a;
    cout<<a[0]<<endl;  //Line 1
    a[0]='A';     //Line 2
}

编译器如何决定调用哪个函数?我发现在运行程序时总是调用版本1。谁能告诉我它为什么会这样?版本2如何被调用?

2 个答案:

答案 0 :(得分:6)

如果a是const,则会调用第二个重载。

int main(){
    const String a;
    cout<<a[0]<<endl;   // would call const version
    a[0]='A';           // will not compile anymore
}

答案 1 :(得分:1)

如果对象是 const ,则将调用 const 成员函数。如果对象是非const ,则会调用非const 成员函数。

<强>异常
如果它们只是const函数,则无论如何都会调用它。

#include <iostream>
using namespace std;

class Foo {
public:
    void print() {
        cout << "Foo non-const member function\n";
    }
    void print() const {
        cout << "Foo const member function\n";
    }
};

class Bar {
public:
        void print() const {
                cout << "Bar const member function\n";
        }
};


int main() {
    Foo foo_non_const;
    const Foo foo_const;

    Bar bar_non_const;
    const Bar bar_const;

    foo_non_const.print();
    foo_const.print();

    bar_non_const.print();
    bar_const.print();

    return 0;
}

$ ./blah

Foo non-const member function
Foo const member function
Bar const member function
Bar const member function