Как компилаторът решава коя функция да извика?

предполага се, че има две претоварени членски функции (константна версия и неконстантна версия) в класа String:

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?


person JDein    schedule 21.04.2012    source източник


Отговори (2)


Ако обектът е 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;
}

$ ./бла

Foo non-const member function
Foo const member function
Bar const member function
Bar const member function
person Peter    schedule 21.04.2012
comment
Между другото, как може неконстантен обект да извика функцията const? - person JDein; 25.04.2012

Ако a е const, второто претоварване ще бъде извикано.

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