C ++ передача строковых ссылок в функции

0

У меня есть два вопроса о строках C++:

  1. string func(string & s) выражения string func(string & s) работает аналогично string & func(string & s), но как вы определяете, является ли возвращаемое значение ссылочным или нереляционным?
  2. Почему я не могу использовать func((string)str)?


Код выглядит следующим образом, включая комментарии, показывающие мое намерение с вопросами 1 и 2:

#include <iostream>
#include <string>
using namespace std;

//Q1:string func(string & s){
string & func(string & s){
    s[2]='S';
    return s;
}

int main(){
    char str[]={'H','H','H','H'};
    string name="HHHHH";
    //Q2:string tmp=(string)str;
    //string rest=func(tmp);
    string rest=func((string)str);
    cout<<"rest"<<rest;
}
  • 0
    Что касается Q1: это должно быть очевидно, если вы знаете, что такое ссылки на C ++. Что касается Q2: вы не можете создать std :: string из массива символов, если этот массив символов не заканчивается нулем.
  • 0
    char str[] = { 'H', 'H', 'H', 'H' } - это массив из четырех символов, а не C-строка. C-строки заканчиваются нулевым байтом, эквивалентным char str[] = { 'H', 'H', 'H', H', 0 /* or '\0' */ }; или char str[] = "HHHH";
Теги:
string

1 ответ

3

Q1: Возвращает string& возвращает ссылку на исходную строку. Возвращаемая string возвращает копию исходной строки. Кроме того, возвращающая string& делает выражение функции функцией lvalue, тогда как возвращающая string делает ее rvalue.

Q2: (string)str создает временную std::string инициализированную с str. Поэтому это rvalue. Но func ожидает, что его аргумент будет lvalue, так как параметр является ссылкой non- const lvalue.

  • 0
    Я понял: это из-за неконстантности, а не из-за tmp-obj, которые делают меня неправым

Ещё вопросы

Сообщество Overcoder
Наверх
Меню