如果我有一个指向对象的指针,那么就说Object *ptr;
,我想把它传递给void foo(Object& obj)
形式的方法我理解我需要写:
foo(*ptr);
但为什么要解除引用ptr
?传递它foo(ptr);
是否有意义?我担心*ptr
可能会对原始对象进行复制,或者至少不只是传递给foo
地址来使用。
任何人都可以为我清除这个吗?传递*ptr
是一个潜在的瓶颈,因为代码期望它的行为与函数void foo(Object *obj);
一样快并且通过foo(ptr)
调用吗?
答案 0 :(得分:12)
我很担心* ptr可能正在复制原始对象。
你错了。取消引用指针不会进行任何复制!
void f(Object & obj); //note it takes the argument by reference
Object *ptr = get();
foo(*ptr);
此代码的最后一行没有副本。标准为您提供保证。
但是,如果f
通过值获取参数,那么将复制。
底线:函数参数中的引用用于避免复制(经常)或作为输出参数(偶尔)!
答案 1 :(得分:12)
传递*ptr
是否确实复制取决于被调用函数是否需要Object
或Object &
。
在前一种情况下,将制作副本。在后一种情况下(即你的情况),没有副本。
答案 2 :(得分:0)
通过引用传递对象只是传递指针,因此foo(* ptr)是正确的,不会复制对象。为什么要解除引用呢?因为函数签名需要一个对象,而不是一个指向对象的指针。 C ++是一种强类型语言。
答案 3 :(得分:0)
要传递对函数的引用,您必须像在值语义中那样传递对象。指针不是引用,因为它们是实体语义(地址)。
如果取消引用指针,则会得到一个实际值,可以作为参考嵌入。
答案 4 :(得分:0)
参考文献和指针是相同的。但是引用有它们自己的优点,那就是它们不能为空(虽然它们可以但是很难做出空引用)所以你可以省略对nullptr的检查。您可以使用 。而不是 - >这是一个较短的字符xD。关于你的问题,因为指针是引用是相同的,最终将没有任何收益选择一个而不是另一个。我的意思是编译后的代码是相同的。
void foo(int &r) {}
和
void foo(int *p) {}
当您使用引用时,将在后台进行解除引用。 希望它有所帮助。