取消引用指针并将其传递给通过引用获取其参数的函数会创建对象的副本吗?
问问题
14866 次
4 回答
42
在这种情况下,指针处的值将被复制(尽管这不一定是这种情况,因为优化器可能会对其进行优化)。
int val = *pPtr;
但是,在这种情况下,不会发生复制:
int& rVal = *pPtr;
没有复制发生的原因是因为引用不是机器代码级别的构造。它是一个更高级别的构造,因此是编译器在内部使用的东西,而不是为其生成特定代码。
显然,函数参数也是如此。
于 2010-12-14T07:30:44.450 回答
8
在简单的情况下,没有。但是,还有更复杂的情况:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
这里创建了一个临时对象,因为取消引用的指针 ( int
) 的类型与函数参数 ( ) 的基本类型不匹配float
。存在一个转换序列,并且转换后的临时可以绑定到,arg
因为这是一个 const 引用。
于 2010-12-14T09:32:40.603 回答
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
。
于 2010-12-14T07:25:55.560 回答
3
不,引用或多或少就像具有不同表示法的指针以及没有空引用的限制。但就像指针一样,它只包含对象的地址。
于 2010-12-14T07:26:51.250 回答