在JAVA中用等号对类对象进行赋值,实际上操作的是对象的地址。
eg:
package MyText; class ClassA { int value; public void seta(int value) { this.value = value; } public void show() { System.out.println("the value:" + value); } } public class MyText { public static void main (String []args) { ClassA a = new ClassA(); a.seta(1); a.show(); System.out.println("a:" + a);//a的地址 ClassA b = new ClassA(); b.seta(2); b.show(); System.out.println("b:" + b);//b的地址 System.out.println("======================"); b = a; a.show(); b.show(); System.out.println("a:" + a + ", b:" + b); b.seta(3); a.show(); b.show(); System.out.println("a:" + a + ", b:" + b); } }
运行结果:
the value:1
a:MyText.ClassA@14a55f2
the value:2
b:MyText.ClassA@15093f1
======================
the value:1
the value:1
a:MyText.ClassA@14a55f2, b:MyText.ClassA@14a55f2
the value:3
the value:3
a:MyText.ClassA@14a55f2, b:MyText.ClassA@14a55f2
在java中向函数传入类对象参数实际上操作的也是地址
eg:
package MyText; class ClassA { int value; public void seta(int value) { this.value = value; } public void show() { System.out.println("the value:" + value); } } public class MyText { public static void showClassA(ClassA a) { a.show(); System.out.println("a:" + a); a.seta(5); a.show(); System.out.println("a:" + a); } public static void main (String []args) { ClassA a = new ClassA(); a.seta(1); a.show(); System.out.println("a:" + a); showClassA(a); a.show(); System.out.println("a:" + a); } }
运行结果:
the value:1
a:MyText.ClassA@5e55ab
the value:1
a:MyText.ClassA@5e55ab
the value:5
a:MyText.ClassA@5e55ab
the value:5
a:MyText.ClassA@5e55ab
而在C++中向函数传递类对象参数时,是按值传递的,即实参与形参间进行成员变量赋值操作,而不是地址
eg:
# include <iostream> using namespace std; class ClassA { private: int value; public: void seta(int value) { this->value = value; } void show() { cout<<"the value : "<<value<<endl; } }; void show(ClassA a) { a.show(); cout<<"a:"<<&a<<endl; a.seta(5); a.show(); } int main () { ClassA a; a.seta(3); a.show(); cout<<"a:"<<&a<<endl; show(a); a.show(); }
运行结果:
the value : 3
a:0x22fefc
the value : 3
a:0x22fea0
the value : 5
the value : 3
Process returned 0 (0x0) execution time : 0.130 s
Press any key to continue.
对于利用等号对对象进行赋值,实际上也是对对象成员的值按值传递,而不是传递地址
eg:
# include <iostream> using namespace std; class ClassA { private: int value; public: void seta(int value) { this->value = value; } void show() { cout<<"the value : "<<value<<endl; } }; int main () { ClassA a; a.seta(3); a.show(); cout<<"a:"<<&a<<endl; ClassA b; b.seta(4); b.show(); cout<<"b:"<<&b<<endl; b = a; a.show(); b.show(); cout<<"a:"<<&a<<", b"<<&b<<endl; b.seta(6); a.show(); b.show(); cout<<"a:"<<&a<<", b"<<&b<<endl; }
运行结果:
the value : 3
a:0x22fefc
the value : 4
b:0x22fef8
the value : 3
the value : 3
a:0x22fefc, b0x22fef8
the value : 3
the value : 6
a:0x22fefc, b0x22fef8
Process returned 0 (0x0) execution time : 0.132 s
Press any key to continue.