если я возвращаю класс в своей функции, где он хранится? - PullRequest
0 голосов
/ 01 января 2019

посмотрите на мой код:

#include <iostream>
using namespace std;
class MyClass{
public:
    char ch[50] = "abcd1234";
};
MyClass myFunction(){
    MyClass myClass;
    return myClass;
}
int main()
{
    cout<<myFunction().ch;
    return 0;
}

Я не могу понять, где хранится мое возвращаемое значение?это хранится в стеке?в кучу?и остается ли он в памяти до завершения моей программы?

если она хранится в стеке, могу ли я быть уверен, что значения моего класса никогда не изменятся?

объясните, пожалуйста, механизм этих возвратов.а если возвращаемая структура отличается от возвращаемого класса?

Ответы [ 5 ]

0 голосов
/ 01 января 2019

Ваша функция возвращает копию объекта.Он будет храниться в стеке в памяти.Возвращающийся объект.будет существовать до тех пор, пока объем этой функции.После этого он будет уничтожен.Тогда ваше выражение cout<<function(); также будет иметь копию этого объекта.который возвращается функцией.Это будет полностью уничтожено после выполнения этого cout<<function(); выражения.

0 голосов
/ 01 января 2019

Экземпляр, возвращаемый myFunction , является временным, он исчезает, когда перестает быть полезным, поэтому он не существует после cout <<....Просто добавьте деструктор, и вы увидите, когда он будет вызван.

Что вы имеете в виду под Могу ли я быть уверен, что значения моего класса никогда не изменятся? ?Вы получаете копию экземпляра.

Возвращаемая структура отличается от возвращаемого класса? : struct похожа на класс где все по умолчанию общедоступны, это единственное отличие.

0 голосов
/ 01 января 2019

Когда вы создаете объект в любой функции, он уничтожается, как только заканчивается выполнение функции, как в переменных.Но когда вы возвращаете объект из функции, сначала компилятор создает локальный экземпляр этого объекта в куче с именем unnamed_teven, а затем уничтожает созданный вами объект.И копирует содержимое unnamed_teven по вызову.Тогда это уничтожает и это безымянное _временное.Все, что вы создадите без ключевого слова new, будет создано в стеке.Да, контексты вашей переменной ch не изменятся, если вы не откроете эту переменную и не измените ее самостоятельно.

0 голосов
/ 01 января 2019

MyClass myClass; хранится в стеке.Он уничтожается сразу после выхода myFunction().

Когда вы return делаете это, в стеке создается копия.Эта копия существует до конца включающего выражения: cout << myFunction().ch;


Обратите внимание, что если ваш компилятор достаточно умен, второй объект вообще не должен быть создан.Скорее, первый объект будет жить до конца включающего выражения.Это называется NRVO , Именованная оптимизация возвращаемого значения .

Также обратите внимание, что стандарт не определяет "стек".Но любая обычная реализация будет использовать стек в этом случае.


, если возвращаемая структура отличается от возвращаемого класса?

В C ++ нет структур;Ключевое слово struct создает классы.Единственная разница между class и struct заключается в доступе к члену по умолчанию, поэтому ответ «нет».

0 голосов
/ 01 января 2019

Это зависит от реализации, чтобы найти разумное место для хранения этого значения.Хотя он обычно находится в стеке, определение языка не накладывает никаких требований на то, где оно фактически хранится.Возвращаемое значение является временным объектом, и оно уничтожается в конце полного оператора, в котором оно создано;то есть он уничтожается в ; в конце строки, которая вызывает myFunction().

...