c++ - 传递 (int x) 和 (const int &x) 之间的区别

标签 c++

我正在阅读 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/

相关文章:

c++ - 虚拟公共(public)模式下从模板类继承的类的原型(prototype)

c++ - 为什么编译器并不总是优化掉局部变量?

c++ - boost 单元测试 mpl 列表的笛卡尔积

c++ - 错误 c2036 : unknown size if structure

c++ - 如何连接 LPCWSTR?

c++ - 我应该如何播种随机引擎?

c++ - 我应该下载哪个 Clang 编译器?

c++ - 如何编译boost线程库

c++ - 如何从另一个 C++ 类访问一个结构?

c++ - OpenGl:Arcball相机旋转问题