1、C++中一般採用以下三种方法之中的一个管理指针成员:

(1)指针成员採取常规行为。

这种类具有指针的全部缺陷:具有指针成员且使用默认复制构造函数和赋值操作符,无法避免悬垂指针(两个对象的指针成员指向同一内存。删除了当中一个指针指向的内存时,还有一个指针将不再指向有效的内存空间)。

(2)类能够实现所谓的"智能指针"行为。引入计数类,智能指针类将一个计数器与类的对象相关联。使用计数跟踪该类有多少个对象共享同一指针。当计数为0时。删除对象。

(3)类採取值行为。採用重载的复制构造函数、赋值操作符和析构函数。

2、指针成员採取常规行为演示样例:两个指针指向同一块内存,会引起不可预料的后果

  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include <iostream.h>
  4. class HasPtr
  5. {
  6. public:
  7. HasPtr(int *p,int i):ptr(p),val(i){}
  8. int *get_ptr()const{return ptr;}
  9. int get_val()const{return val;}
  10. void set_ptr(int *p){ptr=p;}
  11. void set_val(int i){val=i;}
  12. int get_ptr_val()const{return *ptr;}
  13. void set_ptr_val(int val)const{*ptr=val;}
  14. private:
  15. int *ptr;
  16. int val;
  17. };
  18. int main(int argc, char* argv[])
  19. {
  20. int *p=new int(10);
  21. cout<<p<<endl;
  22. HasPtr ptr(p,10);
  23. cout<<ptr.get_ptr()<<endl;
  24. delete p;
  25. cout<<ptr.get_ptr_val()<<endl;  //p和ptr中的指针指向同一对象。删除该对象后,ptr中的指针不再指向有效的对象。
  26. return 0;
  27. }

3、"智能指针"行为演示样例:注意构造函数

  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include <iostream.h>
  4. class HasPtr;
  5. //计数类U_Ptr全部成员均为private,将HasPtr设置为计数类的友元类,使其能够訪问U_Ptr的成员
  6. class U_Ptr
  7. {
  8. friend class HasPtr;
  9. int *ip;
  10. size_t use;
  11. U_Ptr(int *p):ip(p),use(1){}
  12. ~U_Ptr()
  13. {
  14. delete ip;
  15. }
  16. };
  17. class HasPtr
  18. {
  19. public:
  20. HasPtr(int *p,int i):ptr(new U_Ptr(new int(*p))),val(i){} //构造函数,创建新的U_Ptr对象
  21. HasPtr(const HasPtr &orig):ptr(orig.ptr),val(orig.val){++ptr->use;} //复制构造函数,计数加1
  22. HasPtr& operator=(const HasPtr &rhs)  //赋值操作符,左操作数计数减1,右操作数计数加1,假设左操作数减至0,则删除左操作数指向的对象
  23. {
  24. if (this!=&rhs)
  25. {
  26. ++rhs.ptr->use;
  27. if(--ptr->use==0)
  28. delete ptr;
  29. ptr=rhs.ptr;
  30. val=rhs.val;
  31. }
  32. return *this;
  33. }
  34. ~HasPtr() //析构函数,计数减1,假设计数减至0,就删除对象
  35. {
  36. if (--ptr->use==0)
  37. {
  38. delete ptr;
  39. }
  40. }
  41. int *get_ptr()const{return ptr->ip;}
  42. int get_val()const{return val;}
  43. void set_ptr(int *p){ptr->ip=p;}
  44. void set_val(int i){val=i;}
  45. int get_ptr_val()const{return *ptr->ip;}
  46. void set_ptr_val(int val){*ptr->ip=val;}
  47. private:
  48. U_Ptr *ptr;
  49. int val;
  50. };
  51. int main(int argc, char* argv[])
  52. {
  53. int *p=new int(10);
  54. cout<<p<<endl;
  55. HasPtr ptr(p,10);
  56. cout<<ptr.get_ptr()<<endl;        //两指针指向同一块内存
  57. cout<<ptr.get_ptr_val()<<endl;
  58. delete p;
  59. return 0;
  60. }

4、定义值型类:三法则(赋值操作符、复制构造函数、析构函数)

  1. #include <string.h>
  2. #include <iostream.h>
  3. class HasPtr
  4. {
  5. public:
  6. HasPtr(int *p,int i):ptr(new int(*p)),val(i){} //构造函数
  7. HasPtr(const HasPtr &orig):ptr(new int(*orig.ptr)),val(orig.val){} //复制构造函数
  8. HasPtr& operator=(const HasPtr &rhs)  //赋值操作符
  9. {
  10. if (this!=&rhs)
  11. {
  12. ptr=new int(*rhs.ptr);
  13. val=rhs.val;
  14. }
  15. return *this;
  16. }
  17. ~HasPtr(){delete ptr;}  //析构函数
  18. int *get_ptr()const{return ptr;}
  19. int get_val()const{return val;}
  20. void set_ptr(int *p){ptr=p;}
  21. void set_val(int i){val=i;}
  22. int get_ptr_val()const{return *ptr;}
  23. void set_ptr_val(int val)const{*ptr=val;}
  24. private:
  25. int *ptr;
  26. int val;
  27. };
  28. int main(int argc, char* argv[])
  29. {
  30. int *p=new int(10);
  31. cout<<p<<endl;
  32. HasPtr ptr(p,10);
  33. cout<<ptr.get_ptr()<<endl;       //p与ptr的指针不是指在同一块内存,可是所指向的对象内容是一样的
  34. delete p;
  35. cout<<ptr.get_ptr_val()<<endl;
  36. return 0;
  37. }

C++管理指针成员的更多相关文章

  1. C++ Primer 学习笔记_57_类和数据抽象 --管理指针成员

    复印控制 --管理指针成员 引言: 包括指针的类须要特别注意复制控制.原因是复制指针时.一个带指针成员的指针类 class HasPtr { public: HasPtr(int *p,int i): ...

  2. 【c++】类管理指针成员

    c++编程提倡使用标准库,一个原因是标准库大胆减少对指针的使用.但是许多程序是离不开指针的.包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不复制指针所指向的对象.这样当把一个 ...

  3. C++ Primer 有感(管理类的指针成员)

    C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理. 我现在分析一下为什么要管理指针成员. 有如下Student类,Student.h如下: [cpp] view ...

  4. C++ 带有指针成员的类处理方式

    在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存.但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存.在<<c++ primer&g ...

  5. 关于Vector中的元素中含有指针成员的情况

    对于容器,当容器的各个元素为类类型,且该类类型中含有指针成员时: 如果类类型的析构函数中包含了对指针变量指向内存的释放操作,则在利用clear()函数删除容器所有元素时,会自动调用类的析构函数,自动实 ...

  6. 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体

    1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...

  7. C++对象的复制——具有指针成员的类的对象的复制

    //smartvessel@gmail.com class Table{ Name * p; size_t sz; publish: Table(size_t s = 15){p = new Name ...

  8. C++函数指针相关 & 类成员的指针 & 成员函数的指针

    有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...

  9. 15.含有指针成员的类的拷贝[ClassCopyConstructorWithPointerMember]

    [题目] 下面是一个数组类的声明与实现.请分析这个类有什么问题,并针对存在的问题提出几种解决方案.  C++ Code  123456789101112131415161718192021222324 ...

随机推荐

  1. Appium + python - automator定位升级版操作

    # coding:utf-8 """参考博客链接:https://www.cnblogs.com/yoyoketang/p/7843819.html"" ...

  2. 快速掌握C#7

    1. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” .如下所示: var input = ...

  3. Android 存储路径选择

    Android能用来存储的地方有两个,一个是手机内置的存储空间,一个是外置的SD卡,内置的存储空间一般比较小,所以应用的缓存建议存储在外置的SD卡中. 在Android系统中如何获得存储的路径呢? p ...

  4. android黑科技系列——Apk混淆成中文语言代码

    一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Ja ...

  5. Windows 下MySQL zip 安装

    主要步骤: 1.下载解压到安装的文件夹 2.配置环境路径 3.配置my.ini文件,设置程序路径和数据存储路径 4.以管理员身份启动Mysqld install(提示sevice安装成功) 5.启动M ...

  6. set statistics profile on实例

    set statistics profile on实例 1.SQL语句实例   SQL 代码   复制 SET STATISTICS PROFILE ON GO SELECT COUNT(b.[Sal ...

  7. C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

    //1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void F ...

  8. BZOJ 4259: 残缺的字符串 FFT_多项式

    Code: #include<bits/stdc++.h> #define maxn 1200000 using namespace std; void setIO(string s) { ...

  9. [jzoj 5776]【NOIP2008模拟】小x游世界树 (树形dp)

    传送门 Description 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达 ...

  10. 12.IDEA中自动导资源包

    在idea工程中,当你赋值一个类文件的部分代码,粘贴到另一个文件中时,需要导入原来文件中的包资源, 自动设置如下