重载C++赋值运算符,使其行为类似Java
Overload a C++ assignment operator to behave like Java
在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对象的某种指针或引用。这是一种间接方法,因此可以有多个引用同一对象的间接方法。
C++中的SomeClass x
就是对象。因此SomeClass y
实际上是一个完全不同的对象。没有间接的。因此,没有办法让一个引用另一个。
C++提供指针(SomeClass* x
)和引用(SomeClass& x
)来处理需要间接寻址的时间。也许这些是你真正想要使用的,尽管这取决于你最初为什么问这个问题。
响应编辑:
不,您不能更改对象的地址。对象的实例在其生存期内将只生活在一个地方,直到它被销毁/释放。
我认为这不好,因为即使将其分配给另一个指针,它所指向的当前对象也会内存泄漏。Java有内存集合,但C++没有。
这是一个很好的问题。这是可能的。
A& operator=(const A& rhs)
{
A * cthis = const_cast<A*>(this);
cthis = const_cast<A*>(&rhs);
return *cthis;
}
编辑:可以在成员函数中更改"this pointer"。但改变"这个指针"并没有多大作用。
这是可以做到的。但是,使用指针间接寻址。
假设你有一个类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.
};
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?