【问题标题】:Pass a string in C++在 C++ 中传递一个字符串
【发布时间】:2010-12-17 23:24:44
【问题描述】:

快速可能很明显的问题。

如果我有:

void print(string input)
{
  cout << input << endl;
}

我怎么称呼它:

print("Yo!");

它抱怨我传递的是 char *,而不是 std::string。有没有办法在通话中进行类型转换?而不是:

string send = "Yo!";
print(send);

【问题讨论】:

  • Josh,你用的是什么编译器?当我使用“g++ -Wall -pedantic xx.cc”编译时,上面的代码对我来说效果很好。
  • 不需要强制转换。你用的是什么编译器?错误到底说了什么?你能展示你的完整源代码吗?
  • 废话。它在我的工作机器上出现故障,它是 Ubuntu 10,使用 g++,没有 -Wall,没有 -pedantic。我刚刚在家里尝试了我的 OSX 机器,它在类构造(因为它在工作中中断)和常规函数中都运行良好。
  • 对我来说适用于 MinGW 中的 g++ 4.5.0 和 Ubuntu 8.04 中的 g++ 4.2.4。根本没有编译器选项。

标签: c++ string function


【解决方案1】:

您可以编写函数来获取const std::string&amp;

void print(const std::string& input)
{
    cout << input << endl;
}

const char*:

void print(const char* input)
{
    cout << input << endl;
}

这两种方式都允许你这样称呼它:

print("Hello World!\n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made

第二个版本确实需要为std::strings 调用c_str()

print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made

【讨论】:

  • 参数是std::string还是const std::string&amp;无关紧要。
【解决方案2】:

你应该可以调用 print("yo!"),因为 std::string 有一个构造函数,它接受一个 const char*。这些单参数构造函数定义了从它们的参数到它们的类类型的隐式转换(除非构造函数被声明为显式,而 std::string 不是这种情况)。你真的试过编译这段代码吗?

void print(std::string input)
{
    cout << input << endl;
} 
int main()
{
    print("yo");
}

它在 GCC 中对我来说编译得很好。但是,如果您像 void print(std::string&amp; input) 这样声明 print ,那么它将无法编译,因为您无法将非常量引用绑定到临时对象(字符串将是从“yo”构造的临时对象)

【讨论】:

    【解决方案3】:

    嗯,std::string 是一个类,const char * 是一个指针。这是两个不同的东西。从string 得到一个指针很容易(因为它通常包含一个可以直接返回的指针),但另一方面,您需要创建一个std::string 类型的对象。

    我的建议:采用常量字符串且不修改它们的函数应始终将const char * 作为参数。这样,它们将始终有效 - 使用字符串文字以及 std::string(通过隐式 c_str())。

    【讨论】:

    • 如果我将它们作为 const char * 传递,我可以在成员初始化列表中使用它们吗?现在我正在将字符串传递给一个构造,并通过它来初始化它们。
    • 我认为不存在对 c_str() 的隐式调用。我认为您必须明确拨打电话。
    • @Rob Adams,如:string s = "something";函数(s.c_str());对?它是显式的,因为它已被实例化为变量,s? (不是讽刺,严肃的问题。)
    • 叹息,这些天我看到太多的字符串类实现了。有些有operator const char*() const 重载,基本上返回c_str(),但你是对的,std::string 本身没有。
    • 对象的创建就是参数的创建,不需要调用者显式构造。 (顺便说一句,现在下半年的建议可能已经过时了。)
    【解决方案4】:
    print(string ("Yo!"));
    

    你需要用它制作一个(临时的)std::string 对象。

    【讨论】:

    • 即使在 2010 年也没有必要。原始代码应该可以正常工作。
    【解决方案5】:

    对于打印等简单的事情,您可以在预处理器中定义一种函数,例如:

    #define print(x) cout << x << endl
    

    【讨论】:

      【解决方案6】:

      显而易见的方法是像这样调用函数

      print(string("Yo!"));
      

      【讨论】:

      • 即使在 2010 年也没有必要。原始代码应该可以正常工作。
      【解决方案7】:

      使您的函数接受const std::string&amp; 而不是按值。这不仅避免了复制,因此在将字符串接受到函数中时总是更可取,而且它还使编译器能够从您提供的char[] 构造一个临时的std::string。 :)

      【讨论】:

      • 临时不需要构造,参数可以直接从参数构造。 2011 年也应该如此。
      【解决方案8】:

      只需将其转换为 const char *

      print((const char *)"Yo!") 可以正常工作。

      【讨论】:

      • 这不是必需的。原始代码应该可以正常工作。
      猜你喜欢
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2016-06-17
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多