C ++ разыменование между указателями - PullRequest
5 голосов
/ 24 ноября 2011

Скажите, у меня есть класс Foo

class Foo {
}

Я выполняю следующие задания:

Foo *ptrFoo=new Foo();

Foo &ref=*(ptrFoo);  //question 1
Foo afoo=*(ptrFoo); //quesion 2

Мои вопросы:

1) При назначении на "& ref" чтовнутренне происходит с точки зрения памяти?Это просто назначение адреса памяти "ptrFoo" для "ref"?

2) Что происходит при назначении "afoo"?Это вызывает copy-constructor? Это означает, что память выделяется для двух объектов Foo?то есть "afoo" и ранее назначенная память для "ptrFoo"?

3) Скажем, у меня есть метод с именем "void methodBar (const Foo & instance)" Если я передам "ptrFoo" как:

methodBar ((* preFoo));

Что здесь значат для "const"?

Ответы [ 4 ]

8 голосов
/ 24 ноября 2011

1) При присвоении «& ref», что происходит внутри с точки зрения памяти? Это просто назначение адреса памяти "ptrFoo" для "ref"?

Это зависит от вашей платформы, настроек компилятора и компилятора. Ваш компилятор может просто создать синоним для разыменования. Поскольку ссылка не может быть переопределена, нет причины, по которой компилятору действительно нужно выделять какую-либо память для переменной.

2) Что происходит при присвоении "afoo"? Это вызывает copy-constructor? Это означает, что память выделяется для двух объектов Foo? то есть "afoo" и ранее назначенная память для "ptrFoo"?

Да, содержимое Foo, хранящееся в динамическом хранилище, копируется (с помощью конструктора копирования) в экземпляр Foo в автоматическом хранилище. Здесь нет динамического распределения; aFoo экземпляр будет создан так же просто, если бы не было назначения. Например, Foo aFoo;.

3) Скажем, у меня есть метод под названием "void methodBar (const Foo & instance)", если я передам "ptrFoo" как: methodBar ((* preFoo)); что здесь значат слова "const"?

const в этой позиции означает, что хотя элемент передается по ссылке, метод, который объявил эту ссылку const, не может изменять экземпляр ссылочной ссылки.

4 голосов
/ 24 ноября 2011
  1. Когда вы делаете Foo& ref = *ptrFoo;, вы делаете ссылку на *ptrFoo.В настоящее время существует только один Foo.Любое изменение, сделанное вами в ref или *ptrFoo, повлияет на тот же объект.

  2. Когда вы делаете Foo afoo = *ptrFoo; (что совпадает с Foo afoo = ref;), вы создаете другой отдельный Foo, который существует независимо от *ptrFoo.Он инициализируется конструктором копирования Foo.Обратите внимание, что afoo существует в стеке, но *ptrFoo в свободном хранилище (куче).Любые изменения, которые вы вносите в *ptrFoo, не влияют на afoo и и наоборот .Также обратите внимание, что afoo будет уничтожено, и его память будет автоматически освобождена, когда он выйдет из области видимости, но *ptrFoo должен быть уничтожен, а его память освобождена явно, выполнив delete ptrFoo;

  3. const в этом случае означает, что функция принимает ссылку на Foo, которую она обещает не изменять.Он не может вызывать методы для этого Foo, которые не помечены как const.Кроме того, когда вы вызываете эту функцию, новый Foo не создается (то есть он не передается по значению).

2 голосов
/ 24 ноября 2011

1) Он назначает адрес памяти объекта, возвращаемого *(ptrFoo), что эквивалентно ptrFoo.

2) Вызывается конструктор копирования.Теперь у вас есть два объекта, один из которых выделен в куче и на который указывает ptrFoo, а другой - на стек и называется afoo.

3) const означает, чтоМетод methodBar не может изменить объект, на который ссылается Foo& с именем instance.Будет разрешено вызывать методы только на Foo, которые также помечены как const.

2 голосов
/ 24 ноября 2011

1) Создается ссылка на объект, на который указывает ptrFoo, новый объект не создается.

2) Вызывается конструктор копирования, который создает новый объект типа Foo.

3) const означает, что вы передаете ссылку на объект, данные которого не должны быть изменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...