gpt4 book ai didi

c++ - std::shared_ptr 的 PassByVal、PassByRef 和 PassByConstRef 的比较(什么可以(不能)改变)

转载 作者:行者123 更新时间:2023-11-27 23:25:40 25 4
gpt4 key购买 nike

#include <iostream>
#include <string>
#include <memory>

std::shared_ptr<std::string> ptrStr(new std::string("One"));

// increases the reference count to std::string("One") by one after entering the function
// decreases the reference count to std::string("One") by one before exiting the function
void PassByValue(std::shared_ptr<std::string> msg)
{
msg->clear(); // clears the string pointed by ptrStr
msg.reset(new std::string("hello world")); // doesn't change the value of ptrStr
// because it only changes a local copy of ptrStr
// which will be destroyed when the function is returned.
// Note the msg, the local copy of ptrStr, points to the same
// resource where ptrStr points to.
}

// doesn't affect the reference count
void PassByReference(std::shared_ptr<std::string> &msg)
{
msg->clear(); // clears the string pointed by ptrStr
msg.reset(new std::string("hello world")); // does change the value of ptrStr
}

// doesn't affect the reference count
void PassByConstReference(const std::shared_ptr<std::string>& msg)
{
msg->clear(); // clears the string pointed by ptrStr
msg.reset(new std::string("hello world")); // compilation errors
}

int main(int argc, char* argv[])
{
// Each time only one of the following three lines is executed
//PassByValue(ptrStr);
//PassByReference(ptrStr);
//PassByConstReference(ptrStr)

std::cout << *ptrStr << std::endl;

return 0;
}

注意:我不是在这里争论哪种传递机制是好是坏。我只想了解 std::shared_ptr 的不同传递机制的结果,并且只想关注传递 std::shared_ptr 作为函数参数。

问题1> 请帮忙看下评论,如有错误请指正

问题2> 无论选择哪种机制,您总是可以更改std::shared_ptr指向的资源吗?

问题 3> std::shared_ptr 是否与其他函数参数相似并且在 PassByValue、PassByReference 和 PassByConstReference 方面具有相似的行为。

谢谢

最佳答案

Question1> Please help read the comments and correct me if I am wrong

据我了解,您的意见是正确的。

Question2> Is it true that no matter which mechanism you choose, you can always change the resource pointed by the std::shared_ptr?

嗯,有点。您始终可以从 std::shared_pointer 中检索原始指针。当您将其作为 const 传递时,您将获得一个 const 原始指针。如果您要操作指向对象的内容,就会出现编译错误。但是有一些方法可以将 const 指针转换为 普通 指针,例如使用 const_cast

Question3> Is it true that std::shared_ptr is similar as other function parameters and play similar behavior regarding PassByValue, PassByReference, and PassByConstReference.

从 C++ 的角度来看,std::shared_pointer 与任何其他类型一样都是类型,因此在参数传递方法方面没有区别。

关于c++ - std::shared_ptr 的 PassByVal、PassByRef 和 PassByConstRef 的比较(什么可以(不能)改变),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9686778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com