首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

深度探索C++对象模型之(7)

2013-01-26 
深度探索C++对象模型之(七)如果喜欢,请关注:JellyThink

深度探索C++对象模型之(七)

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

如果喜欢,请关注:JellyThink | 思想的果冻

更多原创精彩博文,尽在www.jellythink.com

还可以关注新浪微博:http://weibo.com/u/1887014677

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

0102030405060708091011121314151617181920212223242526272829303132333435363738#include "stdafx.h" #includeusingnamespace std; classA{public:      A()      {            num = 10;      }       ~A()      {      }        char*str;       intnum;}; int main(){      A *a1 =new A;      a1->str =new char[100]; // class A里面的str申请的空间      memset(a1->str, 0, 100 );       char*test = "JellyThink";      strcpy(a1->str, test);       A *a2 =new A;      a2 = a1;       cout<<str<<endl;      cout<<str<<endl;       deletea1;       //cout<<str<<endl;      cout<<str<<endl;}

如所示程序,在a1中申请的内存空间,然后建立a2对象,将a1赋值给a2时,由于进行的是浅复制,出现问题是,a1->str和a2->str指向的是同一块内存,当delete a1对象后,就出现a2->str指向的内存访问错误问题。而此时就需要进行深赋值,防止这种错误的发生,而只有正确的理解了这里的浅复制出现的时机,才能正确防止这种错误的发生,即使发生了这种错误,也能正确的找到解决问题的方法。

不会发生浅复制的场合: 1.当一个类中有一个member object,而这个member object有Copy Constructor时,就不会发生浅复制(不管这个Copy Constructor是显示声明的还是隐式合成的);

 

2.当class继承自一个基类时,而这个基类有Copy Constructor时,就不会发生浅复制(不管这个Copy Constructor是显示声明的还是隐式合成的);

 

3.当class声明了一个或多个virtual function时;

 

4.当class派生自一个继承串链,其中有一个或多个virtual base class时。

在前两种情况下,编译器必须将member或base class的Copy Constructor调用操作安插到被合成的Copy Constructor中。
对于后两中情况下,将在《深度探索C++对象模型之(八)》中进行讲解。

2013/1/20 于东软大连

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

如果喜欢,请关注:JellyThink | 思想的果冻

更多原创精彩博文,尽在www.jellythink.com

还可以关注新浪微博:http://weibo.com/u/1887014677

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


热点排行