|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
|
|