Struct&Class的默认赋值(复制)方式

Struct和Class的默认赋值方式是由编译器提供的,并且这种赋值方式是标准里规定好的。

 

Struct和Class的默认赋值方式是一样的,所以这里我就以Struct来进行简单说明:

Struct的赋值,就是一个一个成员进行值的copy。

 

基于这样的实现方式,一般情况下没有问题,但是,成员是指针的时候,就要格外小心了。

原因如下:

=======================================

指针pA指向A空间
指针pB指向B空间

pA=pB
pA也指向了B空间

这里在释放pA指向的空间,就是把B空间释放了

如果B空间我们是不想释放的,那么就会出问题。

因为,当B空间释放后,系统会将这个空间收回,再利用。

所以,等到我们再次释放pB指向的空间的时候(B空间),程序就会崩溃。

 

这也是c++中说的:

一般如果构造函数里面为裸指针分配了空间的话,都必须重写拷贝构造函数和赋值函数

=======================================

下面这段代码是验证Struct赋值的。

 

#include <stdio.h>
#include <stdlib.h>

typedef struct dataItem
{
        int m_Item1;
        int m_Item2;
        char *m_Item3;
}Item;

Item g_dataItem={3,4,"g_dataItem"};
Item ga_dataItem[2]={
	 {5,6,"ga_dataItem[1]"},
	 {7,8,"ga_dataItem[2]"}
	 };

void changeItem(Item *pdataItem);
void changeItem2(Item *pdataItem);

main()
{
      Item dataItem;

      dataItem.m_Item1 = 1;
      dataItem.m_Item2 = 2;
      dataItem.m_Item3 = "dataItem";
      
      printf("dataItem address=%x\n",&dataItem);
      printf("\n");
      
      printf("g_dataItem address:%x\n",&g_dataItem);
      printf("\n");
       
      printf("ga_dataItem address:%x\n",ga_dataItem);
 	  printf("ga_dataItem[0] address:%x\n",&ga_dataItem[0]);
 	  printf("ga_dataItem[1] address:%x\n",&ga_dataItem[1]);
      
      printf("\n********************************\n");
      
      printf("dataItem address:%x\n",&dataItem);
      printf("\n");
      
      changeItem(&dataItem);
      printf("m_Item1=%d\n",dataItem.m_Item1);
      printf("m_Item2=%d\n",dataItem.m_Item2);
      printf("m_Item3=%s\n",dataItem.m_Item3);
      printf("\n\n");
      
      changeItem2(&dataItem);
      printf("m_Item1=%d\n",dataItem.m_Item1);
      printf("m_Item2=%d\n",dataItem.m_Item2);
      printf("m_Item3=%s\n",dataItem.m_Item3);

	  printf("\n********************************\n");      
      system("pause");
}

void changeItem(Item *pdataItem)
{
 	  printf("@changeItem function\n");
	  printf("pdataItem:%x\n",pdataItem);
 	  printf("&g_dataItem:%x\n",&g_dataItem);
 	  printf("\n");
	  *pdataItem = g_dataItem;
	  
}

void changeItem2(Item *pdataItem)
{
 	  printf("@changeItem2 function\n");
	  printf("pdataItem:%x\n",pdataItem);
 	  printf("&g_dataItem:%x\n",&ga_dataItem[1]);
 	  printf("\n");
	  *pdataItem = ga_dataItem[1];
	  
}


输出如下:

dataItem address=22ff60

g_dataItem address:402000

ga_dataItem address:40200c
ga_dataItem[0] address:40200c
ga_dataItem[1] address:402018

********************************
dataItem address:22ff60

@changeItem function
pdataItem:22ff60
&g_dataItem:402000

m_Item1=3
m_Item2=4
m_Item3=g_dataItem


@changeItem2 function
pdataItem:22ff60
&g_dataItem:402018

m_Item1=7
m_Item2=8
m_Item3=ga_dataItem[2]

********************************
请按任意键继续. . .

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.NET中,类和结构是两种用于封装数据和行为的重要类型。它们具有一些相似之处,但也有一些重要的区别。 相似之处: 1. 成员变量和成员方法:类和结构都可以包含成员变量和成员方法。这些成员可以用于表示对象的状态和行为。 2. 封装:类和结构都支持封装,可以将相关的数据和方法组织在一起,提供访问控制和隐藏实现细节。 不同之处: 1. 内存分配:类是引用类型,而结构是值类型。当创建一个类的实例时,实际上是在堆上分配了一块内存,并返回一个指向该内存的引用。而创建一个结构的实例时,实际上是在栈上分配了一块内存,该内存直接包含了结构的数据。 2. 默认行为:类的实例是通过引用进行传递和赋值的,而结构的实例则是通过复制进行传递和赋值的。这意味着当你将一个类的实例给另一个变量时,它们引用同一块内存;而将一个结构的实例给另一个变量时,会复制该结构的数据。 3. 继承:类支持继承,可以从其他类派生出新的子类。而结构不支持继承,它们是封闭的,不能被派生。 选择使用类还是结构取决于具体的需求和场景。一般来说,如果你需要表示一个有复杂行为和状态的对象,或者需要使用继承等面向对象的特性,那么选择类是更合适的。如果你只需要表示一个简单的数据结构,并且希望在传递和赋值时进行值复制,那么选择结构是更合适的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值