我在课堂上有这样的方法。
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这样的方法接受非常规值,但最好将字符串作为const传递!
因为它被怀疑无法编译因为它:
我想知道,我尝试做的一切都好吗?
如何将const字符串转换为字符串? (我尝试使用C风格的转换或const_cast - 但没有成功)。
提前致谢!
答案 0 :(得分: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();
答案 1 :(得分:4)
如果您传递const string
或引用const string
,则需要使用const_iterator
:
string::const_iterator iter1= word.begin();