我正在阅读 C++ Primer Plus(第 6 版)这本书,我遇到了一些让我感到困惑的东西,所以在我尝试解释时请耐心等待...
如果我有一个原型(prototype)如下所示的函数:
void cube(double x);
另一个函数的原型(prototype)看起来像这样:
void cube(const double &x);
两者有什么区别?对于第一个函数原型(prototype),值是按值传递的,这意味着它将被复制,因此不会被函数改变。对于第二个原型(prototype),值是通过引用传递的,但它是一个常量引用,因此 C++ 将创建一个匿名临时变量并将参数的值分配给临时变量,从而模仿按值传递。所以,本质上这两个函数原型(prototype)之间真的没有区别,对吧?那么 (const double &x) 有什么意义呢?
最佳答案
For the second prototype, the value is passed by reference but it's a constant reference so C++ will create an anonymous temporary variable and assign the value of the argument to the temporary variable thus mimicking pass by value.
尽管 C++ 在某些情况下会这样做。例如,如果您传递一个返回 double
的表达式,C++ 将创建一个临时的:
double v = 123.456;
cube(5*v+321.0123);
但是,它不一定会那样做。例如,如果您进行此调用
double v = 123.456;
cube(v);
C++ 会将对 v
的引用直接传递给 cube()
函数。在这种情况下,对 v
的并发修改将在 cube()
函数运行时“可见”。
So, in essence there is really no difference between the two function prototypes, right?
没错,两者并没有太大区别。假设 double
占用的空间量与对 double
的引用相同,那么性能上也不会有差异。
What is the point of
(const double &x)
then?
虽然按值或常量引用传递 double 之间几乎没有什么区别,但在处理其他类型(例如 std::string
)时,您可能会发现相当大的区别。当您将算法编码为模板时,即当您必须编写时,通过常量引用获取参数变得非常有用
void cube(const T& v);
和您的T
可以是任何类型。常量引用方法让您可以控制正在进行的复制量,因为从某个对象大小开始,传递引用比传递拷贝便宜得多。
关于c++ - 传递 (int x) 和 (const int &x) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31503063/