C ++ - это язык семантика значений , что означает, что по умолчанию типы обрабатываются как значения, копируются и т. Д., В отличие от Java или C #, которые имеют ссылочную семантику . Давайте проанализируем программу:
void foo( objholder );
int main(int argc, char **argv){
objholder o; // [1]
foo(o); // [2]
bar(o); // [3]
}
void foo( objholder oh ) { // [4]
object tmp; // [5]
oh.setobject( tmp ); // [6]
} // [7]
В [1] создается новый объект o
в области действия main
. Этот объект содержит подобъект obj
типа object
, инициализированный согласно objholder
конструктору по умолчанию . В [2] копия этого объекта выполняется и передается в foo
([4]), который создает локальный object
([5]), который передается методу-члену setobject
oh
в [6], (помните: oh
является копией objholder
в main
), потому что objholder::setobject
принимает элемент по значению, создается копия tmp
, и это копия передается в oh.setobject
, которая, в свою очередь, делает копию и сохраняет ее в атрибуте member (не показан в коде). В [7] выполнение foo
завершается, и все локальные переменные уничтожаются в обратном порядке создания, что означает, что tmp
уничтожается, а затем oh
(что, в свою очередь, означает, что внутренняя копия tmp
уничтожен).
В этот момент мы вернулись в main
, где наш локальный объект o
остался нетронутым - все, что было обработано, было копией , переданной foo
. Затем, как и при вызове foo
, создается копия и передается bar
.
Я начал замечать, что это связано с семантикой value в C ++ по сравнению с семантикой reference в других языках, таких как Java или C #. Если бы программа была (с синтаксисом в стороне) Java, в [2] и [3] была бы передана копия ссылки , и упомянутый объект как в main
, foo
и bar
было бы то же самое. Это может быть достигнуто в C ++ с помощью указателей и ссылок. Ссылки на C ++ не просто похожи на ссылки на Java / C #, поэтому, если вы пришли из любого из этих языков, потребуется время, чтобы понять сходства и различия.