Суть заключается в техниках программирования, в которых применяются указатели и ссылки. Например, при перегрузке оператора "+" для Вашего класса, Вы не сможете воспользоваться указателями не потеряв при этом простую семантику операции сложения. Выглядит это так:
1. используем ссылки:
//...
class A;
A operator+ (const A& ra, const A& rb){/*...*/}
void f(A a, A b)
{
A c;
c=a+b; //верно, a и b передаются по ссылке в operator+
}
//...
2. используем указатели:
//...
class A;
A operator+ (A* pa, A* pb){/*...*/}
void f(A a, A b)
{
A c;
c=a+b; //не верно, правильно будет с = operator+(&a, &b) или c = &a + &b
}
//...
Ясно, что в этих примерах аргументы не передаются по значению из соображений эффективности (копирование больших объектов).
Более того, если мы захотим написать что-то вроде a+b+c, то... в случае с указателями запись приобретает еще более "кривой" вид:
//...
&( &a + &b ) + &c;
//...
зато при использовании ссылок мы смело можем написать a+b+c.
p.s. к нижним веткам: ссылка в отличие от указателя всегда "валидна", все примеры "не валидных" ссылок являются элементарнейшим хаком (зачем в таком случае Вам вообще нужен С++ ??? Правильно, не нужен

).
p.p.s. а все что я написал есть в каждом "толковом" букваре С++, поэтому пинайте авторов

.