取消引用指针并将其传递给通过引用获取其参数的函数会创建该对象的副本吗?
答案 0 :(得分:31)
在这种情况下,指针的值被复制(尽管不一定是这种情况,因为优化器可能会优化它)。
int val = *pPtr;
在这种情况下,不会发生任何副本:
int& rVal = *pPtr;
没有复制的原因是因为引用不是机器代码级构造。它是一个更高级别的构造,因此是编译器在内部使用而不是为其生成特定代码的东西。
显然,同样适用于功能参数。
答案 1 :(得分:6)
在简单的情况下,没有。但是有更复杂的案例:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
这里,创建了一个临时对象,因为解除引用的指针(int
)的类型与函数参数(float
)的基本类型不匹配。存在转换序列,转换后的临时序列可以绑定到arg
,因为这是一个const引用。
答案 2 :(得分:4)
希望它不会:如果被调用的函数按值获取其参数,那就是它。
此外,这是参考的预期行为:
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
此代码应打印1
,因为 inc
通过引用获取其参数。如果在inc
电话上打了副本,代码就会打印0
。
答案 3 :(得分:3)
没有。引用或多或少就像具有不同符号的指针和没有空引用的限制。但就像指针一样,它只包含一个对象的地址。