我想知道两者之间有什么区别

void foo(std::shared_ptr<A> a_){
   //work on a_
}


void bar(std::shared_ptr<A>& a_){
   //work on a_
}



这里的引用对某些东西有用吗?由于我正在对a_进行副作用,所以我相信不会。但是有可能写这样的东西,所以我真的很纳闷。

谢谢!

最佳答案

就像在其他任何数据类型的情况下一样,智能指针在这个意义上没有什么不同:

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

  • 看这个简单的例子
    #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

    关于c++ - 指针C++的参数引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43112070/

    10-16 22:27