C++ 拷贝构造(三)
来源:互联网 发布:淘宝圈椅三件套 编辑:程序博客网 时间:2024/06/16 06:50
如果一个类有指针,需要另外写拷贝构造函数。否则,就会形成浅拷贝,造成两个指针指向同一个内存,在析构的时候出错。
#include <iostream>#include<cstring>using namespace std;class Person{public: Person(const char *s); ~Person(); void print(); char *name;};Person::Person(const char *s){ name = new char[::strlen(s) + 1]; ::strcpy(name, s);}Person::~Person(){ delete[] name;//array delete}void Person::print(){ std::cout << name << std::endl;}void main(){ Person p1("John"); Person p2(p1); p1.print(); p2.print(); printf("p1.name=%p\n", p1.name);//一样 printf("p2.name=%p\n", p2.name);//一样 return 0;}
也就是说,浅拷贝会将指定对象的成员变量复制到目标对象,对象当中的指针成员变量也是。这会造成一个问题,如果浅拷贝完成后释放指定对象的指针成员变量指向的堆内存区域,目标对象对此并不知情,如果它对这块内存进行操作,就会引发异常。
因此,需要定义一个自己的拷贝构造。
To Person declaration add copy ctor prototype:Person(const Person& w); //copy ctorTo add copy ctor defintion:Person::Person(const Person& w){ name = new char[::strlen(w.name)+1]; ::strcpy(name,w.name);}
另外一种拷贝构造函数的调用时机是当声明一个类的对象并赋值时:
int main(){ A a; A t = a;//注意,此时调用的是拷贝构造函数,深拷贝 A b; b = a;//赋值操作,浅拷贝,除非在A类中重载“=”操作符 return 0;}
阅读全文
0 0
- C++ 拷贝构造(三)
- 【C++】拷贝构造函数
- C++:拷贝构造函数
- c++"拷贝构造函数
- C++: 拷贝构造函数
- 【C++】拷贝构造函数
- c++::拷贝构造函数
- 【C++】:拷贝构造函数
- 【C++】拷贝构造函数
- C++:拷贝构造函数
- C++_拷贝构造函数
- C++_拷贝构造函数
- 拷贝构造函数(C++)
- 拷贝构造函数(C++)
- [C++]拷贝构造的玄机
- C/C++ 拷贝构造函数
- c++(拷贝构造函数)
- 5.c++-拷贝构造函数(深拷贝,浅拷贝)
- 17.7.29 随笔
- 留着以后慢慢做的AC自动机
- YARN基本框架分析
- MyEclipse 代码自动提示功能失效 提示No Default Proposals 或 no completions available 的解决方法
- ajax 请求json 数据问题
- C++ 拷贝构造(三)
- 微信小程序开发(1)----post方法与get方法的封装
- Java中Collection扩展之commons
- 二维数组 参数传递
- HDU4745环的回文串
- redis.conf的常用配置
- Android-自定义滑动按钮
- java内存区域知识点图解
- mysql中将15位身份证号改为18位