Хороший вопрос. Вы правы, это происходит только со сложными типами. То есть классы и структуры, std :: string такой объект. Реальная проблема, связанная с этим, связана с конструктором.
Когда объект создан, то есть
std::string s;
Вызывается его конструктор, он, вероятно, выделяет некоторую память, выполняет инициализацию некоторых других переменных, готовится к использованию. Фактически, в этот момент в коде может быть выполнено большое количество кода.
Позже вы делаете:
s = "hello world!";
Это заставляет класс отбрасывать большую часть того, что он сделал, и готовиться заменить его содержимое новой строкой.
На самом деле это сводится к одной операции, если вы задаете значение, когда переменная определена, т. Е .:
std::string s = "Hello world";
на самом деле, если вы наблюдаете код в отладчике, один раз выполните другой конструктор вместо конструирования объекта, а затем отдельно установите значение. Фактически предыдущий код работает так же, как:
std::string s("Hello world");
Надеюсь, это помогло немного прояснить ситуацию.