【问题标题】:Pointer to c++ string指向 C++ 字符串的指针
【发布时间】:2011-04-12 22:00:44
【问题描述】:

在下面的代码中,我在 change() 函数中使用了指向 c++ 字符串的指针。

在使用指向字符串的指针时,是否可以使用字符串类的运算符?例如,at() 适用于 [] 运算符,但是有什么方法可以使用 [] 运算符吗?

#include <string>
#include <iostream>

using namespace std;

void change(string * s){

    s->at(0) = 't';
    s->at(1) = 'w';
    // s->[2] = 'o'; does not work
    // *s[2] = 'o'; does not work


}

int main(int argc,char ** argv){

    string s1 = "one";

    change(&s1);

    cout << s1 << endl;

    return 0;
}

【问题讨论】:

  • *s[2] 接近但不够接近。你的意思是写(*s)[2]。后缀运算符的绑定总是比前缀运算符强,因此您必须在 *s 周围使用括号。

标签: c++ pointers stl


【解决方案1】:

取消引用:

(*myString)[4]

但是,我可以建议使用引用而不是指针:

void change(string &_myString){
    //stuff
}

这样您就可以像使用对象一样使用所有内容。

【讨论】:

  • 谢谢!我有它作为参考,但我的教授说不要使用它们,因为当您阅读函数调用“change(s1);”时您不希望变量被修改。
  • @mmmmaaaatttttttttttttt:这是不使用参考的糟糕理由。使用引用的好处是它清楚地表达了参数不能为空的条件。在一个大型项目中,这有助于明确哪些地方需要空检查,并消除了许多冗余检查的可能性。您的函数应该明确命名,以便从它们的名称中预期会有变异行为。 change 至少在某种程度上实现了这一目标。
  • @mmmmaaaatttttttttttttt - 这可能是一个问题——当函数调用不像 change(s1) 那样明显时——但更大的问题是 NULL 是否是一个有效值。在教授的课程之外,使用引用“如果需要参数并且函数不会存储指向它的指针或以其他方式影响它的所有权” [Sutter & Alexandrescu, "C++ Coding Standards"]。
  • @mmmmaaaatttttttttttttt:废话。你的教授错了。
  • @mmmmaaaatttttttttttt:如果不修改引用变量,则在函数声明中应以const为前缀:void no_change(const string &amp; my_string)。把这个告诉你的教授!
【解决方案2】:

您遇到了运算符优先级问题,请尝试

(*s)[0]

【讨论】:

    【解决方案3】:

    为了完整起见,另一种解决方案:

    s->operator[](2) = 'o';
    

    【讨论】:

      【解决方案4】:

      首先,这里没有理由通过指针传递std::string,使用引用。其次,我认为这可行:

      (*s)[i]
      

      但更好的是:

      void change( string &s )
      {
          s.at(0) = 't';
          s.at(1) = 'w';
          s[2] = 'o';
          s[2] = 'o';    
      }
      

      也减少了取消引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 2013-02-16
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多