C ++ `this` указатель - PullRequest
       14

C ++ `this` указатель

0 голосов
/ 09 мая 2019

1) Чем указатель this отличается от других указателей? Как я понимаю, указатели указывают на память в куче. Означает ли это, что объекты всегда создаются в куче, если на них есть указатель?

2) Можем ли мы украсть this указатель в конструкторе перемещения или назначении перемещения?

Ответы [ 3 ]

7 голосов
/ 09 мая 2019

Чем этот указатель отличается от других указателей?

this ничем не отличается от других указателей, за исключением того, что вы не можете изменить его значение и что оно существует только в функциях-членах. Это зарезервированное ключевое слово.

Как я понимаю, указатели указывают на память в куче. Означает ли это, что объекты всегда создаются в куче, если на них есть указатель?

Нет, указатели (действительные или недействительные) могут указывать «где угодно». Нет, структуры / классы могут быть размещены где угодно. В автоматическом хранилище (стеке), в бесплатном хранилище (куче), где-то еще, если платформа поддерживает это.

Можем ли мы украсть этот указатель в конструкторе перемещения или назначении перемещения?

Не совсем уверен, что вы спрашиваете, но ответ, скорее всего, нет.

6 голосов
/ 09 мая 2019

Чем этот указатель отличается от других указателей?

Указатель this существует только в контексте функции-члена класса, отличного от static.Это также неявно, его имя является зарезервированным ключевым словом, и оно всегда является prvalue выражением .В остальном он такой же, как и любой другой указатель.

Как я понимаю, указатели указывают на память в куче.

Указатели могут указывать на что-либо в памяти.Он не ограничен кучей и не является объектами .

Можем ли мы украсть этот указатель в конструкторе перемещения или назначении перемещения?

thisвсегда prvalue выражение.Невозможно назначить ему новый адрес так же, как вы не могли бы присвоить новое значение 5.Дело в том, что объекты существуют в одном месте в памяти на протяжении всей их жизни.Их адрес никогда не может измениться, и было бы нелогично пытаться изменить его, назначив новый адрес this.Перемещение от объекта перемещает значение или состояние , которое объект имеет в другом месте, но сам объект все еще существует по его предыдущему адресу.

2 голосов
/ 09 мая 2019

1) Чем этот указатель отличается от других указателей?

this является ключевым словом.Это не может и не должно быть объявлено.this неявно доступно в нестатических функциях-членах.this относится к аргументу экземпляра функции-члена.

И наоборот, переменные-указатели могут и обычно должны быть объявлены.Пример объявления указателя:

void* ptr = nullptr;

Как я понимаю, указатели указывают на память в куче.

Вы неправильно поняли.Указатели не ограничиваются указанием только в кучу 1 .

Означает ли это, что объекты всегда создаются в куче

Учитывая, что ваша предпосылка невернаОтвет остается без ответа на этот вопрос.Объекты не ограничиваются построением только в куче 1 .Вот пример:

void foo() {
    int i;
    int* iptr = &i;
}

В примере есть два объекта, оба из которых имеют автоматическое хранение (т.е. не динамическое хранение, т.е. не куча 1 ).Один из них является целым числом, а другой - указателем на целое число.Обратите внимание, что указатель не указывает на кучу 1 .


2) Можем ли мы украсть этот указатель в конструкторе перемещения или назначении перемещения?

Зависит от того, что вы подразумеваете под «воровством».Но, вероятно, нет.


1 В языке C ++ нет понятия «кучи» памяти.Вы, вероятно, ссылаетесь на динамическое хранилище или бесплатный магазин.

...