这取决于你到底想达到什么目的:
如果你想改变被传递的对象,那就按引用传递或者使用指针;例如 void f(X&); 或者 void f(X*);
如果你并不想改变被传递的对象,但该对象很大,那就按常量引用传递;例如 void f(const X&);
其它情况则应该按值传递;例如 void f(X);
我所说的“大”为何解?任何超过两个字长的对象。
我为何会想改变参数的值?呃,通常我们不得不这样做,但通常我们也可用另一种方法:产生一个新的值。例如:
我认为对于代码的阅读者来说,incr2() 更易于理解。亦即,incr1() 更易于导致误解和错误。因此,只要创建和复制一个新的值的开销并不“昂贵”,我更喜欢返回新值这种风格,而非那种修改值的风格。
我的确想修改参数的值,那么我应该使用指针还是引用?对此我并没有雄厚的符合逻辑的理由。如果传递“非对象”(例如空指针)是可接受的,那么使用指针是个不错的选择。我的个人风格是,当我想要改变对象的时候,我会使用指针,因为某些情况下,这样更易于看出是否潜在对象被修改的可能性。
注意,调用成员函数本质上就是对对象进行按引用传递,所以,当我们想要改变对象的值/状态的时候,往往会使用成员函数。