在我回答你的问题之前(你可以在这篇文章的末尾找到它),这里是你将参数传递给函数的可能性的简要总结:
1. 复制构造的对象(按值传递):
void cp(point p);
这是按值传递。一个临时对象是从你传入point
的任何对象创建和复制构造的。一旦执行离开函数,临时对象就会被销毁。point
cp
cp
请注意,由于该函数对传递给该函数的任何内容的副本进行操作,因此您可以根据需要修改该本地point
对象,调用者的原始对象不会受到影响。无法使用按值传递的参数来改变这种行为。
2. 对象引用(pass-by-reference):
void cp(point& p);
这是通过引用传递。传递给函数的实际对象在函数内部是可用的(并且可能会受到修改)。如果您不希望函数能够更改传入的对象,请将参数声明为const point&
:
void cp(const point& p);
3. 指向对象的指针(pass-by-reference):
void cp(point* p);
这也是通过引用传递的,有一些细微的差别。一个显着的区别是您可以将空指针传递给函数。这对于引用是不可能的,因为引用必须被初始化并且之后不能被重新安装。-- 与引用一样,如果您想禁止cp
更改传入的point
,请将其声明为 const:
void cp(const point* p);
回答你的问题:
值传递参数在任何方面都不是天生的坏事。当然,有些类型的复制构造成本很高(例如非常大或复杂的对象),或者它具有某些副作用(例如 with std::auto_ptr
)。在这些情况下,您应该小心。否则,它只是 C++ 的另一个具有完全合理用途的特性。