2013-04-22 213 views
1

我在類中有這樣的方法。通過引用傳遞const值的C++

Word Sentence::parse_word(std::string &word) { 
} 

一切工作正常。 經過一番考慮後,我得出結論,這是不好的。 因爲在這個方法裏面,std::string word沒有改變。
所以最好將它作爲const std::string &word來傳遞,以使方法的使用更加明顯和清晰。

而且具有這種簽名的方法我使不可能調用它像parse_word(string("some_text)) -

所以我決定改變簽名:

Word Sentence::parse_word(const string &word) { 
    string::iterator iter1= word.begin(); 
    iter1=find(word.begin(),word.end(),'/'); 
     /*some other code */ 
    } 

即我不改變這個方法中的那個字符串。
我知道我在這裏使用find等方法來接受非包含值,但最好是將string作爲const來傳遞!

,並因爲它的懷疑也不能因爲它編譯: enter image description here

我不知道,是它在所有好的東西我嘗試做?
如何將const字符串轉換爲字符串? (我嘗試使用C風格的轉型或const_cast - 沒有成功)。

在此先感謝!

回答

9

您應該使用的const_iterator代替iterator,因爲你是通過引用調用begin()const

string::const_iterator iter1 = word.begin(); 
//  ^^^^^^ 

與標準集裝箱的接口協議,std::string defines two overloads of the begin() member function:非const合格一個返回一個std::string::iterator和一個const - 合格返回const_iterator

由於正在通過引用調用begin()const,後者過載返回const_iterator被拾取(非const一個顯然是不可行的)。

這就是爲什麼編譯器會拒絕編譯上面的例子。在C++ 11,你可以通過使用auto避免了這樣的煩惱:

auto iter1 = word.begin(); 
4

如果傳遞const string或引用const string,你需要使用一個const_iterator

string::const_iterator iter1= word.begin();