Я хочу спросить о прохождении указателей между функциями или между объектами или их возврате. Я слышал, что передающие или возвращающие указатели в целом (указывают ли они на массив или объект или то, что они указывают) небезопасны, а вывод не гарантируется.
теперь я пробовал это, и до сих пор все кажется ОК, но я не хочу, чтобы мой проект работал случайно... так может кто-нибудь объяснить мне, почему бы не передать или не вернуть указатели и каково предлагаемое решение (например, что если я хочу изменить один и тот же объект (скажем, object1) в функции в другом объекте (функция func в объекте2))?
Кроме того, я читал в учебнике, что все в c++ проходит по значению? не проходит указатели называется pass by reference?
Спасибо всем.
Я хочу спросить о прохождении указателей между функциями или между объектами или их возврате. Я слышал, что передающие или возвращающие указатели в целом (указывают ли они на массив или объект или то, что они указывают) небезопасны, а вывод не гарантируется.
С чего взял? В общем, это неправда и, конечно же, вы можете обойти указатели.
Трудность заключается в управлении владением (выделенными кучей) объектами, поскольку где-то вы должны снова освободить память. Другими словами: когда вы выделяете память 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&
), которые действительно являются перекрестными ссылками.
Ну, честный ответ заключается в том, что люди иногда имеют в виду разные вещи, когда говорят "прохождение по ссылке".
Но в целом, когда люди говорят "пройдя по ссылке", они означают это:
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 будут использовать указатели исключительно.
Большинство людей (я думаю) используют ссылки, когда они могут (например, в вашем гипотетическом примере). Самое приятное, что безопасность типа остановит вас, если вы запутаете ссылки и указатели.