2012-04-21 77 views
4

假定有兩個重載成員函數在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如何被調用?

回答

1

如果對象是常量,所述的常量成員函數將被調用。如果對象是非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 
+0

順便說一句,怎麼能一個非const對象調用const函數? – JDein 2012-04-25 09:08:07

6

如果a是常量,則會調用第二個重載。

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