| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 Julia999 于 2019-7-31 18:43 编辑  
1.拷贝构造函数调用的时机(1)用已有对象初始化新创建对象- int main()
 
 - {
 
 -    Location A(1,2);
 
 -    Location B(A);
 
 -    cout<<B.getX()<<","<<B.getY()<<endl;
 
 - }
 
  复制代码 
(2)函数的类类型初始化形参时 
- void f(Point p)
 
 - {}
 
 - mian()
 
 - {
 
 -      Point A(1,2);
 
 -      f(A);
 
 - }
 
  复制代码 
在上面这个例子中,我们把实参传给行参的时候,会自动出现拷贝构造函数。 
(3)函数返回类类型 
- Point g()
 
 - {
 
 -    Point A(1,2);
 
 -    return A;
 
 - }
 
 - void main()
 
 - {
 
 -    Point D=g();
 
 - }
 
  复制代码 
在上面这个例子中,函数的返回值A实际上是一个A的拷贝,并不是返回A本身。 
(3)与重载的赋值运算(=)区别 
- int main()
 
 - {
 
 -    Name Obj1("zhangsan");
 
 -    Name Obj2=Obj1;//调用复制构造函数
 
 -    Name Obj3("NoName");
 
 -    Obj3=Obj2=Obj1;
 
 - }
 
 
  复制代码 
 
2.浅拷贝和深拷贝? 
浅拷贝——仅拷贝栈里的数据 
深拷贝——拷贝栈和堆里的数据 
例子:(一个有问题的程序) 
- #include<iostream>
 
 - using namespace std;
 
 - class name
 
 - {
 
 - public:
 
 -    name(char *pa);
 
 -    ~name();
 
 - protected:
 
 -    char *pname;
 
 -    int size;
 
 - };
 
 - name::name(char *pa)
 
 - {
 
 -    cout<<"Constructing"<<pa<<endl;
 
 -    pname=new char[strlen(pa)+1];
 
 -    if(pname!=0) strcpy(pname.pa);
 
 -    size=strlen(pa);
 
 - }name::~name()
 
 - {
 
 -    cout<<"Destructing"<<pname<<endl;
 
 -    delete []pname;
 
 -    size=0;
 
 - }
 
 - int main()
 
 - {
 
 -     name Obj1("noname");
 
 -     name Obj2=Obj1;
 
 - }
 
  复制代码 
上面这个程序出现的问题在于name Obj2=Obj1,两个指针指向了同一个地方,当程序退出的时候,会执行析构函数,但是删除的时候会出现重复删除。 
 
 
例子:修改上面的程序(将浅拷贝改为深拷贝) 
- #include<iostream>
 
 - using namespace std;
 
 - class name
 
 - {
 
 - public:
 
 -    name(char *pa);
 
 -    ~name();
 
 - protected:
 
 -    char *pname;
 
 -    int size;
 
 - };
 
 - name::name(char *pa)  //构造函数
 
 - {
 
 -    cout<<"Constructing"<<pa<<endl;
 
 -    pname=new char[strlen(pa)+1];
 
 -    if(pname!=0) strcpy(pname.pa);
 
 -    size=strlen(pa);
 
 - }
 
  
 
- name::name(const name &Obj)
 
 - {
 
 -    cout<<"Copying"<<Obj.pname<<"into its own block\n"<<endl;
 
 -    pname=new char[strlen(Obj.pname)+1];
 
 -    if(pname!=0)
 
 - {
 
 -      strcpy(pname,Obj.pname);
 
 - }
 
 -    size=Obj.size;
 
 - }
 
  
 
- name::~name()
 
 - {
 
 -    cout<<"Destructing"<<pname<<endl;
 
 -    delete []pname;
 
 -    size=0;
 
 - }
 
 - int main()
 
 - {
 
 -     name Obj1("noname");
 
 -     name Obj2=Obj1;
 
 - }
 
  复制代码 
 
 
 |   
 
 
 
 |