Передача указателей между объектами в C ++

0

Я хочу спросить о прохождении указателей между функциями или между объектами или их возврате. Я слышал, что передающие или возвращающие указатели в целом (указывают ли они на массив или объект или то, что они указывают) небезопасны, а вывод не гарантируется.

теперь я пробовал это, и до сих пор все кажется ОК, но я не хочу, чтобы мой проект работал случайно... так может кто-нибудь объяснить мне, почему бы не передать или не вернуть указатели и каково предлагаемое решение (например, что если я хочу изменить один и тот же объект (скажем, object1) в функции в другом объекте (функция func в объекте2))?

Кроме того, я читал в учебнике, что все в c++ проходит по значению? не проходит указатели называется pass by reference?

Спасибо всем.

  • 0
    да, передача указателя по сути является передачей по ссылке (для указанного значения). Но в противном случае указатели могут быть безопасно переданы объектам и от них, если есть четко определенные инварианты, которым они следуют, так что вы знаете, что может и не может случиться с указателями.
  • 0
    так что я могу безопасно использовать указатели, если знаю, на что я указываю, без проблем?
Показать ещё 1 комментарий
Теги:
pointers

2 ответа

2

Я хочу спросить о прохождении указателей между функциями или между объектами или их возврате. Я слышал, что передающие или возвращающие указатели в целом (указывают ли они на массив или объект или то, что они указывают) небезопасны, а вывод не гарантируется.

С чего взял? В общем, это неправда и, конечно же, вы можете обойти указатели.

Трудность заключается в управлении владением (выделенными кучей) объектами, поскольку где-то вы должны снова освободить память. Другими словами: когда вы выделяете память new, вам придется освободить ее снова с помощью delete.

Пример:

A* function1(A* a) {
    return a;
}

B* function2(B* b) {
    return new B(b);
}

function1 возвращает существующий указатель. Тот, кому принадлежит переданный объект A, также будет иметь возвращенную, так как это то же самое. Это необходимо документировать, поскольку эти знания необходимы для использования function1 !

function2 создает новый объект класса B, копируя его входной аргумент. Тот, кто вызывает function2 будет владеть возвращенным объектом и будет отвечать за его delete когда это будет сделано. Опять же, это нужно документировать!

Кроме того, я читал в учебнике, что все в c++ проходит по значению? не проходит указатели называется pass by reference?

Технически, прохождение указателей является передачей по значению, так как сам указатель копируется. Но поскольку указатель является "ссылочным типом", вы по существу получаете пошаговую ссылку.

Обратите внимание, что c++ также знает ссылки (int&), которые действительно являются перекрестными ссылками.

  • 0
    спасибо Фердинанд, ваш ответ действительно помог ^ _ ^
1

Ну, честный ответ заключается в том, что люди иногда имеют в виду разные вещи, когда говорят "прохождение по ссылке".

Но в целом, когда люди говорят "пройдя по ссылке", они означают это:

void readInt(int &a) {
    cin >> a;
}

int a;
readInt(a);
cout << a;

И "pass by pointer" будет следующим:

void readInt(int *a) {
    cin >> *a;
}

int a;
readInt(&a);
cout << a;

В конечном счете, вы можете использовать указатели для всего, на что ссылаются ссылки (они, в основном, верны).

Некоторым людям нравятся ссылки, потому что они могут использовать . оператора, как обычно. Другие предпочитают указатели, потому что они явны.

Обратите внимание, что указатели старше ссылок (C не имеет ссылок), поэтому библиотеки C будут использовать указатели исключительно.

Большинство людей (я думаю) используют ссылки, когда они могут (например, в вашем гипотетическом примере). Самое приятное, что безопасность типа остановит вас, если вы запутаете ссылки и указатели.

  • 0
    спасибо за ваше объяснение .. так что в принципе нет ничего плохого в том, чтобы передавать и возвращать указатели, пока я знаю, на что я указываю .. Я использую библиотеку, которая использует указатели в значительной степени, поэтому я не хочу запутывать себя в моем коде о том, когда я использовал ссылки и когда я использовал указатели, так это нормально?
  • 0
    Да. Если почти все ваши функции имеют дело с указателями, обязательно используйте указатели.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню