Конкатенация строк - PullRequest
       0

Конкатенация строк

14 голосов
/ 29 августа 2010

Почему это можно сделать

const string exclam = "!";
const string str = exclam + "Hello" + " world";

И сделать это невозможно:

const string exclam = "!";
const string str = "Hello" + " world" + exclam;

Я знаю (хотя не могу понять почему), что это запрещено делать:

const string str = "Hello" + " world" + "!";

как это будет интерпретироваться как const char[6] + const char[6] + const char[1], так с другой стороны, почему это также не разрешено, или почему он использует char[], а не string.

Ответы [ 4 ]

19 голосов
/ 29 августа 2010

Оператор + является ассоциативным слева (вычисляется слева направо), поэтому самый левый + вычисляется первым.

exclam - это объект std::string, который перегружает operator+, так что оба следующих параметра выполняют конкатенацию:

exclam + "Hello"
"Hello" + exclam

Оба они возвращают std::string объект, содержащий объединенную строку.

Однако, если первые две вещи, которые «добавляются», являются строковыми литералами, как в:

"Hello" + "World"

здесь не задействован объект типа класса (здесь нет std::string). Строковые литералы преобразуются в указатели, и для указателей нет встроенного operator+.

3 голосов
/ 29 августа 2010
const string exclam = "!";    // Initialize a c++ string with an ansi c string
const string str = exclam + "Hello" + " world"; // Using the operator+ method of exclam

Вы можете сделать это, потому что operator+ в exclam вернет новую строку, содержащую "! Hello", для которой вы впоследствии вызовете operator+ с "world" в качестве параметра, поэтому вы получите другую строку, котораянаконец, присваивается str с помощью конструктора копирования.

С другой стороны,

const string str = "Hello" + " world" + exclam;

не может быть выполнено, потому что "Hello" это просто const char *, что не 'operator+ принимает const char * в качестве параметра.

3 голосов
/ 29 августа 2010

Это потому, что вы конкатанируете const char[6] + const char[6], что, как вы сказали, недопустимо.

В C ++ строковые литералы (вещи между кавычками) интерпретируются как const char[] s.

Вы можете объединить string с const char[] (и наоборот), поскольку оператор + переопределен в строке, но не может быть переопределен для базового типа.

1 голос
/ 27 ноября 2014

(Новый ответ, это было невозможно в 2010 году)

Теперь вы можете написать

const string str = "Hello"s + " world"s + "!"s;
//                        ^           ^      ^

Добавляя это s после строкового литерала, вы сообщаете компилятору, что на самом деле std::string, а не const char[]. Это означает, что вы можете вызывать функции-члены на нем. Например. ("ABC"s).back() но также +

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