@sddvxd

Как понять, где ссылка и где копия?

Добрый день! Хотел бы у вас спросить, что подразумевает под собой "копия".

//func.cpp
//методы класса
const Factory& Factory::compare(const Factory& f)const{
if(f.a_int>this->a)return f; // Возвращаем ссылку на сравниваемый объект
else return *this; //возвращаем ссылку на текущий объект
}

//функции
int _compare(int a, int b){
if(a>b)return a;
else return b;
}

int& __compare(int& a, int& b){
if(a>b)return &a;
else return &b; 
}


Тут я описал метод класса (сравнивание двух полей объектов типа Factory и возвращение ссылки на больший из них) и 2 функции

Вопрос я задал немного некорректно, вот в чем конкретно он заключается: что из себя представляет копия, как это так она записываться в переменную. С управляемой кучей я все понял, еще я не могу понять, как можно вернуть псевдоним (ссылку) на тип, который размещается не в управляемой куче и вообще почему на него можно создать указатель
  • Вопрос задан
  • 154 просмотра
Решения вопроса 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
На стеке создаётся область, куда копируется значение, например тут:
void doSomething(Type obj);
Объект при передаче будет скопирован, т.е. выделится память на стеке(сдвинется указатель стека) и вызовется конструктор копирования, а после при выходе из функции деструктор
void doSomething(Type &obj);
копирования не произойдёт, т.к. передастся адрес, вообще стандарт не гарантирует, как именно реализованы ссылки но обычно как указатели. Т.е. можно думать о ссылке как об указателе с синтаксическим сахаром.
как можно вернуть псевдоним (ссылку) на тип, который размещается не в управляемой куче и вообще почему на него можно создать указатель

а почему нет? Если речь про стек, то создать то можно, другой вопрос, что указывать после выхода из функции он будет на мусор
Type& doSomething(Type& obj) {
	Type anotherObj = obj;
	return anotherObj;
}
int main() {
        // .... 
	Type &obj = doSomething(something);
	// здесь при работе c obj будет UB
        // .... 
}
Ответ написан
Комментировать
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
С управляемой кучей я все понял, еще я не могу понять, как можно вернуть псевдоним (ссылку) на тип, который размещается не в управляемой куче и вообще почему на него можно создать указатель

На самом деле разница между "кучей" и "не кучей" не такая и большая с точки зрения указателей.
У нас есть 3 варианта размещения переменных:
  1. Куча. int* a = new int(3);
  2. Стек. int b = 5;
  3. Константная память, инициализируемая на старте приложения. char* c = "hello world";


С точки зрения процесса есть большой непрерывный кусок памяти, который называется виртуальная память.
Куча это кусок этой памяти, который хранит сами данные плюс некоторую служебную информацию, которая позволяет например находить свободные места в памяти.
Стек это другой кусок, для которого дополнительно хранится указатель на "голову", который мы сдвигаем при push и pop. Но данные по прежнему в том же большом куске виртуальной памяти с той же адресацией.
Константная память это третья зона с самым простым устройством. Туда записываются значения при старте программы и больше не меняются до конца ее работы.

Также полезно понимать что ссылка и указатель это по сути одно и то же "под капотом". Просто в языке работа с ними выглядит немного по-разному. Ну и ссылка имеет меньше возможностей (а значить меньше простор для ошибки) вроде указывания в никуда (nullptr).

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

Копия это отдельный участок в памяти. Указатели на оригинал и копию будут иметь разные значения. при изменении копии оригинал не будет затронут.
Аналогия с почтовыми адресами более чем уместна. Адрес дома записанный на бумаге - указатель. Сам дом по этому адресу - значение. Создание копии - построить такой же дом в другом месте города. Адрес у копии дома будет разумеется другой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы