2016-03-28 18 views
0

對於演繹的原因,我寫了代碼如下:返回類成員引用運行時錯誤變量結果

class Bike 
{ 
public: 
    Bike(std::string name) : m_name(name) {} 
    std::string& getName() const { return m_name; } 
private: 
    std::string& m_name; 
}; 

int main() { 
    string name("Trek"); 
    Bike bike(name); 

    string& ref1 = name; 
    string& ref2 = ref1; 
    string& ref3 = bike.getName(); // <Error reading characters of string> why? 

    cout << ref1 << endl; // ok 
    cout << ref2 << endl; // ok too 
    cout << ref3 << endl; // Boom. runtime error 

    return 0; 
} 

能有人請解釋這種行爲背後的原因?

回答

2

有人能解釋這種行爲背後的原因嗎?

您正在存儲對構造函數完成執行後沒有活動的對象的引用。您正在存儲一個懸掛參考。

Bike(std::string name) : m_name(name) {} 
       ^^^^^ 

name是堆棧上的變量。函數返回後它不活動。

爲了有一個有效的參考,Bike()的參數必須通過引用傳遞。

Bike(std::string& name) : m_name(name) {} 
       ^^ 
1

您的構造函數按值接受一個字符串。所以它是該函數本地的副本。該字符串在函數結束時被銷燬,從而導致對其的引用無效。如果你想在對象中存儲對字符串的引用(你真的確定要這樣做嗎?),那麼你需要確保字符串將超過引用的使用。您可以通過將構造函數參數更改爲引用來完成此操作。

Bike(std::string& name) : m_name(name) {} 

儘管我認爲最好是重新考慮是否應該首先存儲參考。這似乎沒有多大意義。