c ++通过引用传递const值

时间:2013-04-22 20:02:51

标签: c++ stl const

我在课堂上有这样的方法。

 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传递!

因为它被怀疑无法编译因为它: enter image description here

我想知道,我尝试做的一切都好吗?
 如何将const字符串转换为字符串? (我尝试使用C风格的转换或const_cast - 但没有成功)。

提前致谢!

2 个答案:

答案 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();