指针C ++的参数引用

时间:2017-03-30 08:12:18

标签: c++ pointers reference

< p>我想知道< / p>之间有什么区别? < pre>< code> void foo(std :: shared_ptr< A> a _){    //在a_上工作 } < /代码>< /预> < P>和< / p为H. < pre>< code> void bar(std :: shared_ptr< A>& a _){    //在a_上工作 } < /代码>< /预> &LT p为H.;?< / p为H. < p>此处的引用对某些内容有用吗?由于我正在处理< code> a_< / code>的副作用我相信它不会。但是有可能写出这样的东西,所以我真的很想知道。< / p> < p为H.感谢和LT;!/ p为H.

1 个答案:

答案 0 :(得分:1)

就像任何其他数据类型一样,智能指针在这个意义上没有区别:

  • 传递值时,您可以使用原始对象的副本。
  • 通过引用传递时,您可以修改原始对象。

见这个简单的例子

#include <iostream>
#include <memory>

struct A {
    int a_;
    A(int a) : a_(a) {}
};

void foo_val(std::shared_ptr<A> a_){
    a_ = std::make_shared<A>(10);
}
void foo_ref(std::shared_ptr<A>& a_){
    a_ = std::make_shared<A>(10);
}

int main() {
   std::shared_ptr<A> pA = std::make_shared<A>(20);

   foo_val(pA);
   std::cout << pA->a_ << std::endl;
   foo_ref(pA);
   std::cout << pA->a_ << std::endl;   

   return 0;
}

它输出20, 10,表示foo_val无法更改原始对象,而foo_ref则可以。

demo