Первый и третий варианты хороши - что выбрать, зависит от ваших намерений. Я бы не использовал второй вариант - он не раскрывает его намерения.
Когда вы используете первый метод, вы четко указываете, что добавление будет изменять объект. Когда программист видит:
Foo f1, f2;
f1.add(&f2);
Он/она уже знает, что f1 может/будет изменен этим вызовом.
При использовании третьего метода, вы утверждаете, что ни один из переданных объектов не будет изменен, поэтому, когда программист видит:
Foo f1, f2;
Foo *result;
result = Foo.add(&f1, &f2);
Он/она знает, что f1 и f2 НЕ будут изменены (и вы следует использовать параметры, которые дает вам язык для принудительного применения).
Как я писал - выбор между первым и третьим методом зависит от ваших намерений. Если вы хотите рассматривать Foo как объект значения - это означает, что вы можете доверять тому, что после того, как вы установите его поля, они останутся таким образом независимо от того, куда вы передаете свой объект, используйте третий метод. Если вы хотите рассматривать Foo как объект, состояние которого может и изменится, и вы соглашаетесь с тем, что передача объекта Foo методу может изменить его вариант использования с использованием состояния.
Однако при использовании второго варианта программист не будет знать, изменяете ли вы первый, второй, оба или ни один из аргументов. Не используйте эту опцию.
Dupe: http://stackoverflow.com/questions/1184701/static-vs-non-static-method среди многих других ... –
Не обман: здесь он * делает * имеет смысл рассмотреть метод экземпляра, поскольку он будет работать с данными в экземпляре. –
@Jon: Есть много статических вопросов и вопросов. Я думаю, что все уже охвачено. –