java c 引用区别_Java的引用c++的引用和C指针的区别

这篇博客探讨了Java和C/C++中引用的概念和使用差异。在Java中,引用并不直接指向对象,而是指向对象在堆中的地址,对象的创建和销毁由`new`和垃圾回收机制管理。而在C++中,引用是对象的别名,初始化后即绑定到一个对象,不能改变引用的目标。文章通过代码示例展示了在函数调用中如何影响原始对象,揭示了两种语言中引用传递的不同行为及其对内存操作的影响。
摘要由CSDN通过智能技术生成

Java的引用本质上就是C中的指针,而c++的引用则完全不同;有一个类

class Point {

int x;

int y;

}

同样的一个Point p; 在Java中p表示一个引用,它等同于C语言中 struct Point *p中的p,和C++中的Point *p 的p相似。为什么说相似呢?这里有一个非常需要注意的地方,在Java Point p或者C中 struct Point *p只是声明了变量,并没有分配空间,一定要调用new Point()或者 malloc这样的语句分配空间后才能够正常使用(除非你要用结构体成员的相对地址这种特殊用法 http://coolshell.cn/articles/11377.html)

e而在c++中,Point p 直接调用Point类的构造函数分配内存空间生成对象p,等同于C语言中的结构体定义struct Point p。而在Java中,你永远看不到这个对象,你只有它的引用,看个具体的例子:

Java 代码

public class TestPoint{

static void swap(Point point, int x, int y){

Point temp_p = new Point();

temp_p.x =x;

temp_p.y = y;

point = temp_p;

}

public static void main(String[] args){

Point p = new Point();

p.x = 3;

p.y = 4;

swap(p,5,5);

System.out.println(p.x+" "+p.y);

}

}

执行结果,3 4 ,因为在swap中,point是Java的引用,它被赋值为主函数的p引用,point拉着p,p拉着堆中的一个大气球(Point对象),在函数中新建了一个对象,产生了一个新的引用temp_p,最后point放开p,和temp_p拉手,拉着函数中的临时对象,因此外部的p和对应的对象不变,等同于在函数里面吧 stuct Point *p = temp_P;

C++代码

void swap(Point &point, double x, double y){

Point temp_p;

temp_p.x =x;

temp_p.y = y;

point = temp_p;

}

int main(int argc, char** argv) {

Point p;

p.x = 3;

p.y = 4;

swap(p,5,5);

cout << p.x <

}

输出 5 5 因为point是c++的引用,所有对它的修改等同于对原变量的修改,

如果把swap函数中&该为 Point point,那无论函数里面做什么,外部的Point p都不变,因为在c++中被解读为对象本身,而函数的参数传递和Java一样也是按值传递,因此在函数中复制一个一摸一样的对象,对这个对象的操作不影响外面主函数的对象。而Java 就不同了,看下面的例子

public class TestPoint{

static void swap(Point point, int x, int y){

point.x =x;

point.y = y;

}

public static void main(String[] args){

Point p = new Point();

p.x = 3;

p.y = 4;

swap(p,5,5);

System.out.println(p.x+" "+p.y);

}

}

输出5 5,函数也是按值传递,但复制了一个一摸一样的引用,指向的是主函数的对象,在函数里面对引用的操作会影响到主函数中的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值