在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中),那么它将会改变。 (因此,使用指针的任何解决方案都已淘汰,因为这是我对测试的“控制”。)
希望这是有道理的。
答案 0 :(得分:4)
这是不可能的。这些语言的工作方式完全不同。
Java中的 SomeClass x
是对SomeClass对象的某种指针或引用。它是间接的,所以你可以有多个引用相同对象的原因。
SomeClass x
字面意思是对象。因此SomeClass y
实际上是一个完全不同的对象。没有间接性。因此,没有办法让另一个参考。
C ++提供了指针(SomeClass* x
)和引用(SomeClass& x
)来处理需要间接的时间。也许那些是你真正想要使用的,虽然它取决于你首先提出这个问题的原因。
回应编辑:
不,您无法更改对象的地址。对象的一个实例将在其生命周期内的任何一个地方生活,直到它被销毁/解除分配。
答案 1 :(得分:1)
我认为这没关系,因为即使你将它分配给另一个指针,那么这个指向的当前对象也会被内存泄漏。 Java有内存集合,但C ++没有。
这是一个很好的问题。这是可能的。
A& operator=(const A& rhs)
{
A * cthis = const_cast<A*>(this);
cthis = const_cast<A*>(&rhs);
return *cthis;
}
编辑:可以在成员函数中更改“this pointer”。但改变“这个指针”并没有取得多大成就。
答案 2 :(得分:0)
可以做到。但是,使用指针间接。
假设你有一个类someClass
class someClass
{
someClass *someClsPtr;
public:
someClass(someClass *someClsPtrTemp):someClsPtr(someClsPtrTemp)
{
}
someClass* operator=(someClass *someClsPtrTemp)
{
this->someClsPtr = someClsPtrTemp->someClsPtr;
return this;
}
//now over load operator -> and operator *. Thats it.
};