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