今天和同事(Delphi编程)讨论了一个问题:同一类声明的多个对象之间赋值,传递的是值还是引用
在C++中,对象在声明的时候就已经进行了初始化,调用类的构造函数对新声明的对象进行初始化,对象之间用等号赋值,就是对对象内容的拷贝和覆盖,相当于传值,并不改变对象的地址
如果在声明的时候声明的是指针或引用,在对象之间用等号进行赋值,改变的将是对象成员变量的地址,对象的地址没有改变
对象的地址为什么没有改变,这一点我不怎么明白,希望有高人给予指点,在此先谢过了
下面是测试代码和结果:
先看声明对象的测试代码和结果:
#include "io.h"
#include "stdio.h"
#include "stdlib.h"
#include "iomanip.h"
class A{
public :
A()
{
x = 0;
y = 0;
}
public :
int x;
int y;
};
int main()
{
A a = A();
A b = A();
A c;
a.x = 1;
a.y = 2;
b.x = 3;
b.y = 4;
cout<<"对象创建后地址和内容"<<endl;
cout<<&a<<" "<<&a.x<<" "<<&a.y<<endl;
cout<<&b<<" "<<&b.x<<" "<<&b.y<<endl;
cout<<&c<<" "<<&c.x<<" "<<&c.y<<endl;
cout<<a.x<<" "<<a.y<<endl;
cout<<b.x<<" "<<b.y<<endl;
cout<<c.x<<" "<<c.y<<endl;
cout<<"c = a a = b 进行交换,不改变值"<<endl;
c = a;
a = b;
cout<<&a<<" "<<&a.x<<" "<<&a.y<<endl;
cout<<&b<<" "<<&b.x<<" "<<&b.y<<endl;
cout<<&c<<" "<<&c.x<<" "<<&c.y<<endl;
cout<<a.x<<" "<<a.y<<endl;
cout<<b.x<<" "<<b.y<<endl;
cout<<c.x<<" "<<c.y<<endl;
cout<<"更改值之后"<<endl;
c.x = 555;
c.y = 666;
a.x = 888;
a.y = 999;
cout<<&a<<" "<<&a.x<<" "<<&a.y<<endl;
cout<<&b<<" "<<&b.x<<" "<<&b.y<<endl;
cout<<&c<<" "<<&c.x<<" "<<&c.y<<endl;
cout<<a.x<<" "<<a.y<<endl;
cout<<b.x<<" "<<b.y<<endl;
cout<<c.x<<" "<<c.y<<endl;
scanf("%d",&c);
return 0;
}
结果:
声明指针对象的代码和结果:
#include "io.h"
#include "stdio.h"
#include "stdlib.h"
#include "iomanip.h"
class A{
public :
A()
{
x = 0;
y = 0;
}
public :
int x;
int y;
};
int main()
{
A *a = new A();
A *b = new A();
A *c = new A();
a->x = 1;
a->y = 2;
b->x = 3;
b->y = 4;
cout<<"对象创建后地址和内容"<<endl;
cout<<&a<<" "<<&a->x<<" "<<&a->y<<endl;
cout<<&b<<" "<<&b->x<<" "<<&b->y<<endl;
cout<<&c<<" "<<&c->x<<" "<<&c->y<<endl;
cout<<a->x<<" "<<a->y<<endl;
cout<<b->x<<" "<<b->y<<endl;
cout<<c->x<<" "<<c->y<<endl;
c = a;
a = b;
cout<<"c = a a = b 进行交换,不改变值"<<endl;
cout<<&a<<" "<<&a->x<<" "<<&a->y<<endl;
cout<<&b<<" "<<&b->x<<" "<<&b->y<<endl;
cout<<&c<<" "<<&c->x<<" "<<&c->y<<endl;
cout<<a->x<<" "<<a->y<<endl;
cout<<b->x<<" "<<b->y<<endl;
cout<<c->x<<" "<<c->y<<endl;
c->x = 555;
c->y = 666;
a->x = 888;
a->y = 999;
cout<<"更改值之后"<<endl;
cout<<&a<<" "<<&a->x<<" "<<&a->y<<endl;
cout<<&b<<" "<<&b->x<<" "<<&b->y<<endl;
cout<<&c<<" "<<&c->x<<" "<<&c->y<<endl;
cout<<a->x<<" "<<a->y<<endl;
cout<<b->x<<" "<<b->y<<endl;
cout<<c->x<<" "<<c->y<<endl;
scanf("%d",&c);
return 0;
}
结果:

下面是给出的Delphi的代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TA = class
X, Y: Integer;
end;
TForm1 = class(TForm)
btn1: TButton;
lab1: TLabel;
lab2: TLabel;
lab3: TLabel;
lab5: TLabel;
lab6: TLabel;
lab7: TLabel;
lab8: TLabel;
lab9: TLabel;
lab10: TLabel;
lab11: TLabel;
lab12: TLabel;
lab13: TLabel;
lab4: TLabel;
lab14: TLabel;
lab15: TLabel;
lab16: TLabel;
lab17: TLabel;
lab18: TLabel;
lab19: TLabel;
lab20: TLabel;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
A, B, C: TA;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
lab5.Caption := '仅声明后A地址:'+IntToHex(Integer(@A), 8) + ' '+ IntToHex(Integer(@A.X),8)+ ' '+ IntToHex(Integer(@A.Y),8);
lab6.Caption := '仅声明后B地址:'+IntToHex(Integer(@B), 8)+ ' '+ IntToHex(Integer(@B.X),8)+ ' '+ IntToHex(Integer(@B.Y),8);
lab7.Caption := '仅声明后C地址:'+IntToHex(Integer(@C), 8)+ ' '+ IntToHex(Integer(@C.X),8)+ ' '+ IntToHex(Integer(@C.Y),8);
A := TA.Create;
B := TA.Create;
A.X := 1;
A.Y := 2;
B.X := 3;
B.Y := 4;
lab19.Caption := '赋值后A '+IntToStr(A.X) + ' '+IntToStr(A.Y);
lab20.Caption := '赋值后B '+IntToStr(B.X) + ' '+IntToStr(B.Y);
lab8.Caption := 'Create并赋值后A地址:'+IntToHex(Integer(@A), 8) + ' '+ IntToHex(Integer(@A.X),8)+ ' '+ IntToHex(Integer(@A.Y),8);
lab9.Caption := 'Create并赋值后B地址:'+IntToHex(Integer(@B), 8)+ ' '+ IntToHex(Integer(@B.X),8)+ ' '+ IntToHex(Integer(@B.Y),8);
lab10.Caption :='Create并赋值后C地址:'+IntToHex(Integer(@C), 8)+ ' '+ IntToHex(Integer(@C.X),8)+ ' '+ IntToHex(Integer(@C.Y),8);
C := A;
A := B;
lab1.Caption := '用等号连接后A '+IntToStr(A.X) + ' '+IntToStr(A.Y);
lab2.Caption := '用等号连接后B '+IntToStr(B.X) + ' '+IntToStr(B.Y);
lab3.Caption := '用等号连接后C '+IntToStr(C.X) + ' '+IntToStr(C.Y);
lab11.Caption := '用等号连接后A地址'+IntToHex(Integer(@A), 8) + ' '+ IntToHex(Integer(@A.X),8)+ ' '+ IntToHex(Integer(@A.Y),8);
lab12.Caption := '用等号连接后B地址'+IntToHex(Integer(@B), 8)+ ' '+ IntToHex(Integer(@B.X),8)+ ' '+ IntToHex(Integer(@B.Y),8);
lab13.Caption := '用等号连接后C地址'+IntToHex(Integer(@C), 8)+ ' '+ IntToHex(Integer(@C.X),8)+ ' '+ IntToHex(Integer(@C.Y),8);
B.X := 5;
B.Y := 6;
lab4.Caption := '更改B的值后A '+IntToStr(A.X) + ' '+IntToStr(A.Y);
lab14.Caption := '更改B的值后B '+IntToStr(B.X) + ' '+IntToStr(B.Y);
lab15.Caption := '更改B的值后C '+IntToStr(C.X) + ' '+IntToStr(C.Y);
lab16.Caption := '更改B的值后A地址'+IntToHex(Integer(@A), 8) + ' '+ IntToHex(Integer(@A.X),8)+ ' '+ IntToHex(Integer(@A.Y),8);
lab17.Caption := '更改B的值后A地址'+IntToHex(Integer(@B), 8)+ ' '+ IntToHex(Integer(@B.X),8)+ ' '+ IntToHex(Integer(@B.Y),8);
lab18.Caption := '更改B的值后A地址'+IntToHex(Integer(@C), 8)+ ' '+ IntToHex(Integer(@C.X),8)+ ' '+ IntToHex(Integer(@C.Y),8);
end;
end.
具体结果自己运行分析一下吧