C++ 类中 智能指针 的使用。这个是看的C++primer,在赋值操作符重载函数体里面有一句没看懂……
答案:1 悬赏:20 手机版
解决时间 2021-03-04 16:12
- 提问者网友:却不属于对方
- 2021-03-03 23:00
C++ 类中 智能指针 的使用。这个是看的C++primer,在赋值操作符重载函数体里面有一句没看懂……
最佳答案
- 五星知识达人网友:梦中风几里
- 2021-03-04 00:09
if ( --ptr->use == 0 ){ //【【这句什么意思????】】】
delete ptr;
}
ptr->use 是用来记录智能指针所对应的真实指针被多少个智能指针给使用了。
比如这个赋值操作符中第一句++rhs.ptr->use;因为传递函数rhs对应的指针需要被新的智能指针使用,所以使用数自增一。而当前智能指针需要更换新的指向值,那么就意味着旧的指向值的使用数要减一,所以有--ptr->use。然后再判断这个值是否已经变成0了,如果为0则意味着就指针已经没有被任何智能指针使用了,所以需要释放其内存,调用delete功能。
函数的参数在实际中是等号的右侧。
如:HasPtr ptr1;
HasPtr ptr2 = ptr1;追问难道说在执行 HasPtr ptr2 = ptr1; 这一句的时候,是先执行HasPtr ptr2;
也就是先用默认构造函数初始化了ptr2,同时也出现了新的智能指针,
之后再用ptr1的各项值赋予给ptr2。那么之前出现的那个智能指针就要计数减一,之后判断删除。
是这样吗?追答呃,抱歉,我写的例子似乎是不对的。
首先这个HasPtr函数式没有默认构造函数的,所以你定义一个HasPtr的变量时,必须要传入对应的参数或者用已经存在的HasPtr来进行拷贝构造。
例子改成:
int *pInt1 = new int;
HasPtr ptr1(pInt, 1); //初始化定义ptr1
如果这时候写一句HasPtr ptr2 = ptr1;这一句其实没有调用等号操作符,调用的是拷贝构造函数HasPtr(const HasPtr &orig);所以我的例子写错了,呵呵。下面继续:
int *pInt2 = new int;
HasPtr ptr2(pInt, 1); //初始化定义ptr2
ptr2 = ptr1; //此时调用了等号操作符进行了复制操作,原本ptr1指向的pInt1使用次数+1,而ptr2初始化时指向的pInt2使用次数-1,判断删除;追问我明白了:
HasPtr a1;
HasPtr a2; //此时相当于有两个智能指针存在。都是调用的默认构造函数
HasPtr a3 = a1; //这时也是存在两个智能指针,调用的是复制构造函数
HasPtr a4; //新智能指针4
a4 = a1; //这时,a4的智能指针变为a1的;而a4的原先的智能指针就会先减一后判断是否应该释放,这时调用的是赋值重载。
是不是这样??
哈哈,看来是了刚想追问追答就是这样
delete ptr;
}
ptr->use 是用来记录智能指针所对应的真实指针被多少个智能指针给使用了。
比如这个赋值操作符中第一句++rhs.ptr->use;因为传递函数rhs对应的指针需要被新的智能指针使用,所以使用数自增一。而当前智能指针需要更换新的指向值,那么就意味着旧的指向值的使用数要减一,所以有--ptr->use。然后再判断这个值是否已经变成0了,如果为0则意味着就指针已经没有被任何智能指针使用了,所以需要释放其内存,调用delete功能。
函数的参数在实际中是等号的右侧。
如:HasPtr ptr1;
HasPtr ptr2 = ptr1;追问难道说在执行 HasPtr ptr2 = ptr1; 这一句的时候,是先执行HasPtr ptr2;
也就是先用默认构造函数初始化了ptr2,同时也出现了新的智能指针,
之后再用ptr1的各项值赋予给ptr2。那么之前出现的那个智能指针就要计数减一,之后判断删除。
是这样吗?追答呃,抱歉,我写的例子似乎是不对的。
首先这个HasPtr函数式没有默认构造函数的,所以你定义一个HasPtr的变量时,必须要传入对应的参数或者用已经存在的HasPtr来进行拷贝构造。
例子改成:
int *pInt1 = new int;
HasPtr ptr1(pInt, 1); //初始化定义ptr1
如果这时候写一句HasPtr ptr2 = ptr1;这一句其实没有调用等号操作符,调用的是拷贝构造函数HasPtr(const HasPtr &orig);所以我的例子写错了,呵呵。下面继续:
int *pInt2 = new int;
HasPtr ptr2(pInt, 1); //初始化定义ptr2
ptr2 = ptr1; //此时调用了等号操作符进行了复制操作,原本ptr1指向的pInt1使用次数+1,而ptr2初始化时指向的pInt2使用次数-1,判断删除;追问我明白了:
HasPtr a1;
HasPtr a2; //此时相当于有两个智能指针存在。都是调用的默认构造函数
HasPtr a3 = a1; //这时也是存在两个智能指针,调用的是复制构造函数
HasPtr a4; //新智能指针4
a4 = a1; //这时,a4的智能指针变为a1的;而a4的原先的智能指针就会先减一后判断是否应该释放,这时调用的是赋值重载。
是不是这样??
哈哈,看来是了刚想追问追答就是这样
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯