C ++ передать строку - PullRequest
       7

C ++ передать строку

33 голосов
/ 18 декабря 2010

Быстрый, наверное, очевидный вопрос.

Если у меня есть:

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

Как мне это назвать так:

print("Yo!");

Жалуетсяпередавая в char * вместо std :: string.Есть ли способ опечатать это, в вызове?Вместо:

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

Спасибо.

Ответы [ 7 ]

48 голосов
/ 18 декабря 2010

Вы можете написать свою функцию, чтобы взять const std::string&:

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

Вторая версия требует c_str() для вызова std::string s:

print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made
7 голосов
/ 18 декабря 2010

Вы должны быть в состоянии вызвать print ("yo!"), Поскольку есть конструктор для std :: string, который принимает const char *. Эти конструкторы с одним аргументом определяют неявные преобразования из их аргументов в тип класса (если конструктор не объявлен явным, что не относится к std :: string). Вы на самом деле пытались скомпилировать этот код?

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

Это хорошо для меня в GCC. Однако, если вы объявите print таким образом void print(std::string& input), то он не сможет скомпилироваться, поскольку вы не можете связать неконстантную ссылку с временным (строка будет временным, созданным из "yo")

6 голосов
/ 18 декабря 2010

Ну, std::string - это класс, const char * - это указатель. Это две разные вещи. Легко добраться от string до указателя (поскольку он обычно содержит тот, который он может просто вернуть), но для другого способа вам нужно создать объект типа std::string.

Моя рекомендация: функции, которые принимают константные строки и не изменяют их, всегда должны принимать const char * в качестве аргумента. Таким образом, они всегда будут работать - как со строковыми литералами, так и с std::string (через неявный c_str()).

5 голосов
/ 18 декабря 2010
print(string ("Yo!"));

Вы должны сделать из него (временный) std::string объект.

4 голосов
/ 18 декабря 2010

Очевидным способом было бы вызвать такую ​​функцию

print(string("Yo!"));
1 голос
/ 14 апреля 2017

Просто разыграйте его как константный символ *. print ((const char *) "Yo!") будет работать нормально.

1 голос
/ 03 января 2011

Сделайте так, чтобы ваша функция принимала const std::string& вместо побочного значения. Это не только позволяет избежать копирования, и поэтому всегда предпочтительнее при приеме строк в функции, но также позволяет компилятору создать временный std::string из char[], который вы передаете. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...