重载C ++赋值运算符以表现得像Java

时间:2014-01-17 01:11:11

标签: java c++ assignment-operator

在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中),那么它将会改变。 (因此,使用指针的任何解决方案都已淘汰,因为这是我对测试的“控制”。)

希望这是有道理的。

3 个答案:

答案 0 :(得分:4)

这是不可能的。这些语言的工作方式完全不同。

Java中的

SomeClass x是对SomeClass对象的某种指针或引用。它是间接的,所以你可以有多个引用相同对象的原因。

C ++中的

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.
};