对c++深浅拷贝的剖析

对this指针的一些说明:
  c++编译器给每个成员函数增加了一个隐藏的指针参数,让 该指针指向当前对象(函数运行时所调用函数的那个对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有操作对用户是透明的,即用户不需要传递,编译器自动完成!

  1.this指针的类型是*const,且只能在成员函数内部使用。

  2.this指针本质上其实是一个成员函数的形参,调用该成员函数时,会把对象地址当做实参传入给this指针,所以对象不存储this

  3.this指针是成员函数 第一个隐藏的指针形参,一般情况是由编译器通过ecx寄存器自动传递的,不需要用户传递

对c++中深浅拷贝的认识:

class String
{
public :
String ( const char* str = "wdnmd" )
{
_str = ( char* ) malloc ( strlen ( str ) + 1 );
strcpy ( _str , str );
}
~String ()
{
cout << "~String()" << endl ;
free ( _str );
}
private :
char* _str ;

};

void test()

{ String s1("hello world");

String s2(s1); }

int main()

{ test();

cout << "程序未奔溃" << endl;

system("pause");

return 0;

}

对于深浅 拷贝,string类很具有说服力,大家看上面的这一段代码,我们并没有定义拷贝构造函数,而是使用的是系统默认的拷贝构造函数,直接导致本程序需崩溃 ,应为编译器自己的拷贝构造函数会在拷贝时进行浅拷贝,也称值拷贝,就是 s2(s1)时,只是将s2指向了s1,并没有为s2再申请空间。程序崩溃在 析构函数上,因为当使用完毕后进行释放的时候,s2空间直接释放,不会出现问题,当释放s1空间的时候,因为已经把空间释放过了,直接导致s1指向的位置没了,成了一个名副其实野指针,所以该程序会崩溃!
String(const String& s)
_str = ( char* ) malloc ( strlen (s._ str ) + 1 );
strcpy(_str, s._str);
}
再写一个拷贝构造函数给s2开出一个空间,然后将s1的数据拷贝到s2就行了,问题迎刃而解,这就是深拷贝!
深拷贝不同于浅拷贝,拷贝的时候是实实在在的开辟出了一个新的空间、两个指针都指向不同的空间,但这两块空间都具有相同的数据,这就不会造成一块空间释放两次的尴尬局面!
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值