gpt4 book ai didi

c++ - 如何在 C++ 中按值传递引用?

转载 作者:太空狗 更新时间:2023-10-29 23:34:49 25 4
gpt4 key购买 nike

我正在尝试在 C++ 中创建不可变类型(类),

我这样做是为了让所有“成员函数”方法都不会修改对象,而是返回一个新实例。

我遇到了很多问题,但它们都围绕着 C++ 中的引用类型。

一个例子是当通过引用传递相同类类型的参数时:

Imm Imm::someOp( const Imm& p_im ) const
{
...
p_im = p_im.someOtherOp(); //error, p_im is const, can't modify it!
...
}

该错误是由按引用传递值引起的。相反,如果我按值传递引用,那么上面的错误行就不是错误!

考虑一个 Java/C# 示例

class Imm
{
...
Imm someOp( Imm p_im )
{
....
p_im = p_im.someOtherOp(); //ok, you're not modifying the
//original object, just changing the local reference
....
}
....
}

我如何在 C++ 中做这样的事情?我知道我可以使用指针,但后来我遇到了整个内存管理困惑。我不想担心谁拥有对对象的引用。

理想情况下,我想将类设计为类似于 python 中的不可变字符串;您可以在不注意甚至不知道它们是不可变的情况下使用它们,并且它们的行为与您期望的一样;他们只是工作。

编辑

当然,我可以通过按值传递或使用临时变量(我目前正在这样做)来绕过它。我要问的是“如何在 C++ 中按值传递引用”

我希望答案围绕 STL 中的某些内容展开,我目前正在研究 smart_ptr 系列模板。

更新

感谢您的回复,我意识到无法逃避指针。 (请参阅我的 other question,这实际上是对这个的跟进)

最佳答案

在 Java 和 C# 中,您并不是真正在处理引用 - 它们更像是句柄或指针。 C++ 中的引用实际上是原始对象的另一个名称,而不是指向它的指针(尽管它可能是用指针实现的)。当您为引用赋值时,您是在为对象本身赋值。令人困惑的是,您可以使用 = 字符来初始化引用,但这是初始化,而不是赋值。

 Imm im, im2, im3; 
Imm &imr = im; // initialize a reference to im
imr = im2; // assign im2 to imr (changes the value of im as well)
Imm *imp = &im; // initialize a pointer to the address of im
imp = &im3; // assign the address of im3 to imp (im is unnaffected);
(*imp) = im2; // assign im2 to imp (modifies im3 as well).

如果您特别想传递“按值引用”,那么您实质上是在要求一个矛盾项。根据定义,引用通过引用传递。正如其他地方所指出的,您可以按值传递指针,或者直接传递值。如果你真的想要,你可以保留一个类中的引用并按值传递它:

 struct ImmRef
{
Imm &Ref;
ImmRef(Imm &ref) : Ref(ref) {}
};

另请注意,应用于引用的 const 使引用的对象成为常量,而不是引用。引用始终是常量。

关于c++ - 如何在 C++ 中按值传递引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/648888/

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