Подтвердить что ты не робот

Каковы различия в инициализации строк в С++?

Есть ли разница между

std::string s1("foo");

и

std::string s2 = "foo";

?

4b9b3361

Ответ 1

Да и Нет.

Первая инициализируется явно, а вторая инициализируется копией. Стандарты позволяют заменить второй на первый. На практике полученный код тот же.

Вот что происходит в двух словах:

std::string s1("foo");

Строковый конструктор формы:

string ( const char * s );

вызывается для s1.

Во втором случае. Создается временное, и указанный конструктор-уезд вызван для этого временного. Затем вызывается конструктор копирования. например:

string s1 = string("foo");

На практике вторая форма оптимизирована, чтобы быть первой. Я не видел компилятора, который не оптимизирует второй случай.

Ответ 2

На первый взгляд, первый вызывает конструктор const char* для инициализации s1. Второй использует конструктор const char* для инициализации временного значения, а затем использует конструктор копирования, передавая ссылку на это временное значение, для инициализации s2.

Однако стандарт явно разрешает что-то под названием "copy elision", что означает, что, как говорит AraK, второй может быть заменен на первый, даже если конструктор копирования имеет наблюдаемые побочные эффекты, так что изменение влияет на выход программы.

Однако, когда эта замена выполнена, компилятор все равно должен проверить, что класс имеет доступный конструктор копирования. Таким образом, потенциальная разница заключается в том, что для второй формы требуется, чтобы конструктор копирования мог быть вызван, хотя компилятор не должен его вызывать. Очевидно, что std::string имеет один, поэтому в этом случае это не имеет значения, но для других классов он может.

Ответ 3

нет разницы

Ответ 4

Первый лучше.

Второй создаст экземпляр и присвоит значение по умолчанию ( "). Затем будет выделено седонное назначение:" foo". Итак, 2 назначения вместо 1...