对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就行了,问题迎刃而解,这就是深拷贝!
深拷贝不同于浅拷贝,拷贝的时候是实实在在的开辟出了一个新的空间、两个指针都指向不同的空间,但这两块空间都具有相同的数据,这就不会造成一块空间释放两次的尴尬局面!