有几种情况需要考虑。参数修改(“out”和“in / out”参数)void modifies(T ¶m);// vsvoid modifies(T *param);这种情况主要是关于样式的:你想让代码看起来像call(obj)还是call(&obj)?但是,有两点是重要的:下面是可选的情况,并且您希望在重载运算符时使用引用。......和可选的void modifies(T *param=0); // default value optional, too// vsvoid modifies();void modifies(T ¶m);参数未修改void uses(T const ¶m);// vsvoid uses(T param);这是一个有趣的案例。经验法则是“便宜复制”类型是通过值传递的 - 这些通常是小类型(但并非总是) - 而其他类型则由const ref传递。但是,如果您需要在函数内复制,则应按值传递。(是的,这暴露了一些实现细节.C'est le C ++。)......和可选的void uses(T const *param=0); // default value optional, too// vsvoid uses();void uses(T const ¶m); // or optional(T param)所有情况之间的差异最小,因此请选择最适合您生活的方式。Const by value是一个实现细节void f(T);void f(T const);这些声明实际上是完全相同的功能! 当传递值时,const纯粹是一个实现细节。 试试看:void f(int);void f(int const) { /* implements above function, not an overload */ }typedef void NC(int);
// typedefing function typestypedef void C(int const);NC *nc = &f; // nc is a function pointerC *c = nc;
// C and NC are identical types