C++笔记(四):深复制/浅复制/智能指针

您所在的位置:网站首页 智能指针的类型 C++笔记(四):深复制/浅复制/智能指针

C++笔记(四):深复制/浅复制/智能指针

2023-03-26 01:02| 来源: 网络整理| 查看: 265

深复制/浅复制/智能指针 深复制/浅复制

类的定义:

class Dog { public:Dog(const Dog &str);void SetAge(int age);void ShowAge();void SetName(char *name);void ShowName();Dog(char *name,int age);Dog();virtual ~Dog(); private:int age;char *name; };

下面有两个复制构造函数:

第一个构造函数:

Dog::Dog(const Dog &str) {std::cout name,str.name);this->age = str.age; }

第二个构造函数:

Dog::Dog(const Dog &str) {std::cout age = str.age; }

若是由第二个构造函数构造多个对象时,多个对象的内部指针name指向同一地址;若某一个对象发生析构时,其他对象再对这个类成员进行操作时,发生严重的错误;是因为指针指向的地址已经被释放了,会造成错误;

如果使用第一个复制构造函数,会额外的申请资源,且每个资源是独立的。

对于第一种情况称为深复制;对于第二种情况称为浅复制。

深复制:在发生复制构造时,若构造对象的资源是完全独立的,不共用于复制构造对象,则称为深复制; 浅复制:在发生复制构造时,若构造对象的资源是共用于复制构造对象,则称为浅复制;

在这里插入图片描述

智能指针

为了解决上面的问题,我们加入智能指针。在析构时,会判断是否还有指针指向需要的资源,若有,则不去释放该资源。 智能指针的初步设计,在初始化的时候,对指向资源的指针进行计数;若没有指针指向资源时,释放资源。

#include using namespace std;class U_Ptr {friend class BHasPrt; private:U_Ptr(int *p) : ip(p),count(1) {}~U_Ptr() { delete ip; } private:int *ip;size_t count; };class BHasPrt{ public:BHasPrt(int *p,int i): ptr(new U_Ptr(p)),val(i) {}BHasPrt(const BHasPrt &orig) :ptr(orig.ptr),val(orig.val){++ptr->count;}~BHasPrt(){if (--ptr->count == 0){delete ptr;}}BHasPrt& operator=(const BHasPrt &rhs){++rhs.ptr->count;if (--ptr->count == 0){delete ptr;}ptr = rhs.ptr;val = rhs.val;}int* get_ptr() const { return ptr->ip; }int get_val() const { return val; }void set_ptr(int *p) { ptr->ip = p; }void set_val(int i) { val = i; }int get_ptr_val() const { return *ptr->ip; }void set_ptr_val(int val) const { *ptr->ip = val; } size_t get_ptr_count(void) { return ptr->count;} private:int val;U_Ptr *ptr; };int main(int argc, char* argv[]) {int *ip = new int(42);BHasPrt bhasprt1(ip,53);BHasPrt bhasprt2(bhasprt1);cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3