5 类和结构体

 
class A 
{
public:
	 A()
	{
		a=1;
		b=2;
	 
	}
	char c;
	int a;
	int b;
};
 
int main(int argc, char* argv[])
{
 
	A a;
	printf("%d",a.b);
	return 0;
}

 

看构造函数 返回this指针

空类的占1个字节 用来实例化

 
class A 
{
public:
	 A()
	{
		a=1;
		b=2;
	 
	}
	char c;
	int a;
	int b;
};

class B{
public:
	B()
	{
		;
	}
};

class C:public B
{

};
 
int main(int argc, char* argv[])
{
 
	A a;
	printf("%d\n",a.b);
	B b;
	printf("%d\n",sizeof(B));
	C c;
	printf("%d\n",sizeof(C));
	system("pause");
	return 0;
}

可以看出空类大小是1 PS:静态成员不占用类的空间

类C的继承B,所以C的构造函数内部要调用B的构造函数 如果有B种有虚函数的话,要把B的虚表指向类C 

再来看下继承的布局:


class B{
public:
	B()
	{
		a=1;
		b=2;
		c=3;
	}
 
	int a;
	int b;
	int c;
};

class C:public B
{
public:
	C()
	{
		strcpy(a,"aaa");
		strcpy(b,"bbb");
	}
	char a[10];
	char b[10];
	

};
 
int main(int argc, char* argv[])
{
 
	A a;
	printf("%d\n",a.b);
	B b;
	printf("%d\n",sizeof(B));
	C c;
	printf("%d\n",sizeof(C));
	system("pause");
	return 0;
}

因为继承父类的函数和元素,函数没有内存空间,只是一个地址,里面是代码段,那么元素是要占用内存的,元素占用内存布局是类B数据段+类C数据段

看下子类C的构造函数,再C的构造函数里面先执行了B的构造函数,然后再执行C的构造函数 析构函数的执行顺序是相反的

如果自定义了析构函数 当类的作用域消失的时候会先执行析构函数。

PS:代码清单中因为没有定义析构函数,所以由系统的函数指针来循环执行析构函数。应该在atexit函数中执行。(全局变量和全局对象在_mainCRTStartup函数里面,找到_cinit函数,第二个_inittern函数initerm函数里面进行)。在构造函数和析构函数中会对其进行详细的解释。

 


类作为参数

void calllei(C c)
{
	char *ret=c.getstr();
	printf("%s",ret);
}

类作为参数 先进行拷贝 -- 先栈申请这个类大小的空间 如果很小 用eax edx之类的先压栈 如果很大 通过rep movs之类的指令传送到栈中

参数的传递原则是通过压栈传入数据的,所以先申请栈空间 add esp,-0x198。movs过去数据和push eax之类的效果一样的。


构造函数中对指针进行new或者malloc容易出错

void calllei(C c)
{
	char *ret=c.getstr();
	printf("%s\n",ret);
	printf("address:%08X\n",&ret);
}
int main(int argc, char* argv[])
{
 
	C c;
 
	calllei(c);
	calllei(c);
	system("pause");
	return 0;
}

根据上面所说,传参的时候是通过压栈进行的,那么并没有调用构造函数,看下内存中的操作

而在calllei函数里面调用了2次析构函数,这样就不对应了,因为只分配了一次new或者malloc。

析构函数虽然判断了     if (str!=NULL) 但是每次传参数的时候又把str给赋值了。但是str指向的堆空间已经被free了。 所以会崩溃。

解决办法:把初始化指针的地方放在构造函数外部,那么即使把类当做参数,那么两次执行getstr()的时候会malloc两次。ps:这里是一个错误的说法,如果函数里面不执行getstr()函数,指针没有malloc空间,析构的时候照样报错,所以解决办法还是做深拷贝重写;解决办法:把初始化指针的地方放在构造函数外部,那么即使把类当做参数,那么两次执行getstr()的时候会malloc两次。ps:这里是一个错误的说法,如果函数里面不执行getstr()函数,指针没有malloc空间,析构的时候照样报错,所以解决办法还是做深拷贝重写;这个在构造函数和析构函数中详细介绍。

	C()
	{
		strcpy(a,"aaa");
		strcpy(b,"bbb");
		//str=(char *)malloc(50);
		//strcpy(str,"malloc this callback data");	
	}
	char * getstr()
	{
		str=(char *)malloc(50);
		strcpy(str,"malloc this callback data");
		return str;
	}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值