对象用等号赋值

今天和同事(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.

具体结果自己运行分析一下吧

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daiafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值