gpt4 book ai didi

java - 重载 C++ 赋值运算符使其表现得像 Java

转载 作者:太空狗 更新时间:2023-10-29 20:41:29 27 4
gpt4 key购买 nike

在 Java 中,当您将一个对象分配给另一个对象时,不会复制原始对象,它只是克隆引用。因此,例如,我希望它的行为类似于以下 Java 代码:

SomeClass x = new SomeClass();
SomeClass y;
y = x; // x is not copied, y is simply a (Java) reference to x

我想做的是创建一个行为方式相同的 C++ 类。显而易见的选择是重载赋值运算符,如下所示:

SomeClass& operator=(const SomeClass& rhs)
{
this = &rhs;
return *this;
}

不幸的是,不允许将新位置分配给this;上面的代码甚至无法编译。

有谁知道还有其他方法可以做到这一点吗?

此外,在您开口之前:是的,我知道这绝对是实现赋值运算符的错误方法。无论如何,请放纵我。

编辑 2:为澄清起见,这里是 C++ 代码,其行为应与 Java 中的相同:

SomeClass x = SomeClass(); // Created on stack
SomeClass y; // In C++, same as above; NOT reference or pointer
y = x; // x is not copied, y becomes a (C++) reference to x;
// original y is destroyed when stack unwinds

我根本不想使用指针。

编辑:我这样做是为了看看我是否可以更改通过引用传递给函数的 C++ 对象的基地址。如果我简单地将另一个对象分配给引用变量,它会自动生成一个浅表拷贝,而我不希望这样。我希望引用参数引用一个完全不同的对象。

我这样做是为了了解编译器是如何实现引用的。如果引用是取消引用指针的语法糖,那么在函数之外,参数对象的基地址不会改变。如果它们是符号表中的别名(如在 PHP 中),那么它将改变。 (所以任何使用指针的解决方案都已过时,因为这是我测试的“控制”。)

希望这是有道理的。

最佳答案

这是不可能的。这些语言的工作方式根本不同。

Java 中的

SomeClass x 是某种指针或对 SomeClass 对象的引用。这是一个间接寻址,所以你可以有多个引用同一个对象。

SomeClass x 在C++中字面意思就是对象。因此 SomeClass y 实际上是一个完全不同的对象。没有间接的。所以没有办法让一个引用另一个。

C++ 提供指针 (SomeClass* x) 和引用 (SomeClass& x) 来处理需要间接访问的时间。也许这些是您真正想要使用的,尽管这取决于您最初问这个问题的原因。


响应编辑:

不,您不能更改对象的地址。一个对象的实例在其生命周期内将只存在于一个地方,直到它被销毁/释放。

关于java - 重载 C++ 赋值运算符使其表现得像 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176103/

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