int byRef(A& v){
v = A(3);
return 0;
}
Это вызывает назначение временного объекта объекту, переданному по ссылке, объект, используемый в вызове функции, изменяется. Полное копирование будет выполнено, если не указан оператор присваивания.
int byP (A* v){
v = &A(4); //OR new A(4)
return 0;
}
Копирует указатель на временный объект в переданное значение указателя. Функция присваивания не вызывается. Значение 'v' изменяется, но объект v, на который указывает объект, адрес объекта, переданный в качестве аргумента, остается неизменным.
Если вы сделали это:
struct A {
int x;
A(int v){
x = v;
}
A &operator = (A &rhs){
cout << "assignment!";
}
};
, тогда «назначение» будет выводиться в функции byRef
, но не в функции byP
.
Хотя &
реализован с использованием указателей «под капотом», как уже говорили другие, они рассматриваются как объект, переданный функции в язык.
Итак, чтобы реализовать byRef
с помощью указателей:
int byRefUsingP (A *v)
{
*v = A(3);
// or you could do:
// v->operator = (A(3));
// if an operator = is defined (don't know if it will work without one defined)
return 0;
}