gpt4 book ai didi

java - C++ 和 Java 中引用赋值的区别

转载 作者:行者123 更新时间:2023-11-30 03:15:16 26 4
gpt4 key购买 nike

我已经学习 C++ 两周了。在Java中,如果我们有同一个类的两个不同对象,并且如果我们将一个对象的引用分配给另一个对象的另一个引用,那么它们引用同一个对象。之后,通过一个引用更改数据成员也会更改另一引用中的数据成员。我的问题是:C++ 中不也是这样吗?我对复制构造函数和赋值运算符有点困惑。他们俩都做深复制。据我所知,如果没有它们,我们只能进行浅复制。我也有一个代码片段。

#include <iostream>
using namespace std;

class Test
{
int x;
int &ref;

public:
Test(int i):x(i), ref(x) {}
void print() { cout << ref;}
void setX(int i) {x = i;}
Test &operator = (const Test &t) {x = t.x; return *this;}
};

int main()
{
Test t1(10);
Test t2(20);
t2 = t1;
t1.setX(40);
t2.print(); // This will print 10
cout << "\n\n";
t1.print(); // This will print 40
return 0;
}

最佳答案

In Java, if we have two different objects of the same class, and if we assign the reference of one object to the other reference of the other object, then they refer to the same object.

My question is: Isn't it the same in C++ too?

这根本不一样。在 C++ 中,不能重新分配引用来引用另一个对象。它们在整个生命周期中都引用同一个对象。当对引用进行赋值操作时,所引用的对象就会被赋值。

请注意,Java 没有显式引用。所有类类型变量都是引用,原始变量是值对象。 C++ 则不同。您必须显式指定变量是引用还是对象,并且可以拥有类类型的值对象以及对基本类型的引用。

在某些方面,Java 引用比 C++ 引用更类似于 C++ 指针。特别是,指针可以为空,并且可以被指定为指向其他地方,就像 Java 引用一样。

// Java
int i = 0; // not a reference
i = some_int; // i is modified
Test tref = null; // a reference
tref = t; // reference is modified
tref = other_t; // reference is modified; t is not modified

// C++
Test t; // not a reference
Test& tref = t; // a reference
t = other_t; // t is modified
tref = other_t; // t is modified; reference is not

Test* tptr = nullptr; // a pointer (not a reference)
tptr = &t; // tptr is modified
*tptr = other_t; // t is modified
tptr = other_t; // tptr is modified; t is not modified




关于java - C++ 和 Java 中引用赋值的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205469/

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