Java引用和C++引用区别:
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
答案是:1true
Java的引用在使用上其实是类似于C++指针的用法,相当于通过一个变量存储实际对象的地址。除了基本数据类型,其他类型都是通过引用来传递的。
C++的引用则是给现有的变量取别名,2者是同一个对象,只是名称不同,修改了引用变量的值,原先变量的值也会跟着改变,引用变量一旦指定了是哪一个对象的引用后,就不能更改了。
上题的逻辑是,调用doSomething时,是新建了一个Integer integer,其指向var2所指向的那个栈中的1,然后在函数体里面new Integer(2)即在栈中新建了一个为2的值,integer指向它,但是var2是不受影响的,仍然指向栈中的1。因为这里是传的是包装类类型,属于引用调用,传过来是的原来引用变量的copy值,其指向原来的地址。如果是改变它指向的地址的内容,会影响到原有的值,但是如果是new一个新对象,然后让传过来的引用变量copy值指向这个新对象,并不会影响到原来的引用,这时相当于另创建一个引用。另外如果形参基本类型,则是传值调用,完全不会影响到原来。可以参考Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?
equal是值的比较
==是引用的比较
上述内容转自https://www.cnblogs.com/csuer/p/4620845.html
C++引用和指针区别:
C++引用占用不占空间意思就是不占对象空间,不表示不占指针的少量空间。可以看成指针常量,引用则总是指向在初始化时被指定的对象,以后不能改变。C++中指针可以为空,引用不能为空,因此引用的效率更高。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧引用s1,
// 但是 s1的值现在是
// "Clancy" 因为rs=s2相当于 s1=s2,是将s2的内容赋值给了s1
ps = &s2; // ps 现在指向 s2;
// s1 没有改变
int a = 1;
int &refence_a = a;
int b = 2;
&a = b; // error,一个引用在初始化后就固定下来,不能再变化.
下面以swap例子说明c++指针和引用的区别
//swap以指针为参数,交换指针
void swap(int *i,int *j){
int *temp;
temp=i;
i=j;
j=temp;
}
int main(){
int x=3,y=4;
int *p=&x,*q=&y;
swap(p,q);
//swap(&x,&y);等价于上面两行
printf("%d %d",x,y);//3,4 传递的是指针的copy值,
printf("%d %d",*p,*q);//3,4 在函数中改变指针不会影响到原来的指针
}
//swap以指针为参数,但是交换指针指向的内容
void swap(int *i,int *j){
int temp=*i;
*i=*j;
*j=temp;
}
int main(){
int x=3,y=4;
int *p=&x,*q=&y;
swap(p,q);
//swap(&x,&y);//等价于上面两行
printf("%d %d",x,y);//4,3 传递的是指针的copy值,
//但是copy值也是指向变量的地址
//可以对变量的内容进行操作
}
//swap以引用为参数,交换引用
void swap(int &i,int &j){
int temp=i;
i=j;
j=temp;
}
int main(){
int x=3,y=4;
swap(x,y);
printf("%d %d",x,y);//4,3 传递的是变量的引用,也就是别名
//引用改变时,原变量内容也跟着改变
}