C++中的指针,引用和Java中的对象引用



    一、C++中指针和引用的区别

  • 相同点:在c++中,指针和引用都可以让人间接地操作一个对象。
  • 不同点:
    1、两者在定义上不同:指针是存放对象的地址的一块内存,而引用是对象的别名。
    2、看看以下的几行代码:
int a,b,*p,&r=a;//正确
r=3;//正确:等价于a=3
int &rr;//出错:引用必须初始化
p=&a;//正确:p中存储a的地址,即p指向a
*p=4;//正确:p中存的是a的地址,对a所对应的存储空间存入值4
p=&b//正确:p可以多次赋值,p存储b的地址

    从以上代码我们可以看出第二个不同点:指针可以为空指针,但是引用在声明阶段就必须要初始化。

    3、另外的,由于指针是用于存放对象地址的内存,所以可以改变其值以改变其指向的内容;而引用在定义初期就绑定了对象,不能修改自己指向的对象,所谓从一而终。

    严格意义上讲,以上就是两者的全部区别了,接下来再说说,两者的应用场景和优缺点:

    1、指针的优点在于其更加灵活,你完全可以随时随地的操作指针的值,但是,放纵的同时也会带来隐患,空指针,野指针的问题,如果程序员没有加以控制,则会带来灾难。

    2、引用则很好的避开了指针的缺点:声明时初始化,意味着程序员可以无需对引用进行空指向判断。同时,无法对其绑定的对象进行更改,像极了一个指针常量的实现(const),安全可靠。

    二、Java中的对象引用

    再说回Java,Java中也有引用的概念,也有对象的概念,但是都区别于c++。

    对象:c++中的对象,是一个内存地址和其存储的数据,可以是int、double and so on;Java中有基础数据类型的概念,它的的对象,更加严格,是一个类的实例化,同时Java中所有的类都默认继承了Object类,拥有着Object类的所有特性。

    引用:首先得说明,Java中的引用和C++中的引用完全不是一个东西,Java引用其实更像是指针,因为Java引用本身也占有内存,也指向着一块内存。

    进一步说明C++指针和Java对象引用:

    1、Java对象引用可以为空(如:Person person;);

    2、Java对象引用可以更改其指向的值:

Person p1 = new Person();
Person p2 = new Person();
p1 = p2;

    从上面看来,Java引用是不是像极了指针,然而,凡事都有一个但是:

    总体来说,Java引用功能上还是相对受限的。如,Java对象引用并不像指针那么奔放,不能被直接操作,指针p++,p--,这样的操作在Java中是不可能见到的,同样Java也不能获取引用指向的地址。似乎很让人失望,Java中怎么又没有了指针?

    好吧,如果真的要明说,Java中确实没有指针,或者说,Java中有一个功能受限的指针(阉割版的指针),对C++痴迷的同学或许会对此举很不屑,但是还是那句话,约束换来的是安全,Java中弱化了甚至取消了指针的概念,为的就是更加有力且简洁的面向对象。

    毫无疑问,Java引用是一个很伟大的抽象,弱化指针,取消了指针的运算,语法上全力隐藏指针,为的就是让我们仿佛在和真的对象打交道一般。但这样很容易让人混淆概念,忽略底层实现,初学者必须要谨记,对象引用,不等于对象!!!