std::string s = std::string("foo");
Создает временный объект std::string
, содержащий "foo", затем присваивает его s
.(Обратите внимание, что компиляторы могут исключать временные. Временные исключения в этом случае явно разрешены стандартом C ++.)
std::string s = new std::string("foo");
Это ошибка компилятора.Выражение new std::string("foo")
создает std::string
в бесплатном хранилище и возвращает указатель на std::string
.Затем он пытается присвоить возвращенный указатель типа std::string*
типу s
типа std::string
.Дизайн класса std::string
предотвращает это, поэтому компиляция не удалась.
C ++ - это не Java.Это не то, как объекты обычно создаются, потому что если вы забудете delete
возвращенный объект std::string
, вы потеряете память.Одним из основных преимуществ использования std::string
является то, что он автоматически управляет нижележащим строковым буфером, так что new
- это своего рода побеждает эту цель.# 1.Технически он инициализирует новую временную строку, которая будет содержать «foo», а затем присваивает ее s
.Опять же, компиляторы, как правило, исключают временные (и фактически почти все не глупые компиляторы в настоящее время фактически исключают временные), поэтому на практике он просто создает новый объект с именем s
на месте.
В частности, он вызывает конвертирующий конструктор в std::string
, который принимает аргумент const char*
.В приведенном выше коде конструктор преобразования должен быть не explicit
, в противном случае это ошибка компилятора.Конструктор преобразования фактически не является explicit
для std::string
с, поэтому вышеприведенное компилируется.
Вот как обычно std::string
s инициализируются.Когда s
выходит из области видимости, объект s
будет уничтожен вместе с нижележащим строковым буфером.Обратите внимание, что следующее имеет тот же эффект (и является другим типичным способом инициализации std::string
s), в том смысле, что оно также создает объект с именем s
, содержащий "foo".
std::string s("foo");
Однако, есть небольшая разница между std::string s = "foo";
и std::string s("foo");
, одна из которых заключается в том, что конвертирующий конструктор может быть либо explicit
, либо не explicit
в приведенном выше случае.