Рассмотрим следующий фрагмент кода:
void consumeString(std::string str){
/* some code */
}
void passStringObject(){
std::string stringObject = "string literal";
consumeString(stringObject);
}
void passStringLiteral(){
consumeString("string literal");
}
Теперь рассмотрим следующие два случая:
1) функция passStringObject()
называется.
2) функция passStringLiteral()
называется.
В случае 1 я предполагаю, что — при вызове функции consumeString
в passStringObject
— переменная stringObject
просто передается в функцию consumeString
и (из-за вызова по значению) конструктор копирования класса строки вызывается так, что параметр str является копией переменной stringObject
который был передан в функцию consumeString
,
Но что происходит в случае 2, когда функция consumeString
называется? Вызывается ли (перегруженный) оператор присваивания строкового класса (возможно, присвоение литерала некоторой «скрытой» переменной в фоновом режиме?) Неявным образом вызывается перед вызовом конструктора копирования и копированием значения «скрытой» переменной в параметр str
?
В случае 2 std::string(const char*)
конструктор будет вызван до того, как объект будет передан consumeString
, который затем скопирует временный строковый объект.
В случае строкового литерала временный std::string
Объект создается, а затем копируется в параметр.
Строковые литералы порождают временные std::string
объекты.
Время жизни временного объекта связано с инструкцией C ++, которая его создала.
В этом случае std::string stringObject = "string literal";
конструктор из const char*
вызывается для создания объекта (который не является временным).
В случае 1 вы являетесь человеком, который создает объект, и когда вызывается функция, вызывается конструктор копирования класса string и строка копируется.
Во втором случае параметризованный конструктор (с char *
Параметр) вызывается для создания строкового объекта.
в случае 2 класс строки деструктора будет вызван, как только consumeString
возвращает, и в первом случае деструктор будет вызван дважды один раз для временной переменной в consumeString
функция и другие переменные в passStringObject
;