Как передать строковый литерал в функцию, обрабатываемую в C ++?

Рассмотрим следующий фрагмент кода:

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?

0

Решение

В случае 2 std::string(const char*) конструктор будет вызван до того, как объект будет передан consumeString, который затем скопирует временный строковый объект.

2

Другие решения

В случае строкового литерала временный std::string Объект создается, а затем копируется в параметр.

0

Строковые литералы порождают временные std::string объекты.

Время жизни временного объекта связано с инструкцией C ++, которая его создала.

В этом случае std::string stringObject = "string literal"; конструктор из const char* вызывается для создания объекта (который не является временным).

0

В случае 1 вы являетесь человеком, который создает объект, и когда вызывается функция, вызывается конструктор копирования класса string и строка копируется.

Во втором случае параметризованный конструктор (с char * Параметр) вызывается для создания строкового объекта.

в случае 2 класс строки деструктора будет вызван, как только consumeString возвращает, и в первом случае деструктор будет вызван дважды один раз для временной переменной в consumeString функция и другие переменные в passStringObject;

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector