C++智能指针与重载操作符
2015-07-18 09:57
288 查看
简单记录一下C++的智能指针和重载操作符
把智能指针和重载操作符写在一起并没有什么特殊意义,纯属是因为学完智能指针马上就接触了重载操作符,于是就顺便连起来一起编码和复习了(^_^)。
关于悬挂指针的概念这里就不提了,大家可以试着自己百度一下,解释非常多。
所谓的智能指针,就是通过内设记数机制来防止悬挂指针的出现。
上面的例子只是一个非常普通的智能指针,指定指向string类型。其本质上是一个对象,对象内含有一个指针成员
这里让我想起Java变量释放的机制,同样有一种方法是通过记录对象引用数来决定对象是否应该被释放的。这与智能指针在思想上是一样的。
以上代码是完整的使用智能指针的代码。我不详细解释了,可以在其中看到,为了配合智能指针的使用,我必需在ComputerClass类的各个构造函数和复制构造函数、析构函数中调整智能指针的use值。
重载操作符,其实我觉得是一个简单的C++语法而已。我在这里使用重载操作符,是希望对外隐藏智能指针的存在。譬如,我会在重载的过程中设置use的值。这也是重载的一个重要的作用,完成我们需要完成功能。
写在最后:智能指针的具体作用,其实我并没有什么深入地去探讨,现实懂,然后有一天做项目时发现,用智能指针可以克服一个棘手的问题。那就真是是懂了。
智能指针
C++的智能指针是克服C++大坑的非常有用的的手段,之所以说它智能,是因为它为程序员克服了重要的编程问题——悬挂指针重载操作符
重载操作符,在一定程度上,我觉得不是必要的。当然,为了更好地体现C++代码的简介特性还有面向对象特性,重载操作符确实起了非常重要的作用。在重载操作符的基础上,C++的一些类可以设计得非常复杂,但使用起来会非常人性化。把智能指针和重载操作符写在一起并没有什么特殊意义,纯属是因为学完智能指针马上就接触了重载操作符,于是就顺便连起来一起编码和复习了(^_^)。
关于悬挂指针的概念这里就不提了,大家可以试着自己百度一下,解释非常多。
所谓的智能指针,就是通过内设记数机制来防止悬挂指针的出现。
class SmartPtr { //假设这是一个指向某一品牌字符串的指针 public: string * pt; private: friend class ComputerClass; int use; public: SmartPtr (const string& s): use(0) { pt = new string(s); } ~SmartPtr() { delete pt; } };
上面的例子只是一个非常普通的智能指针,指定指向string类型。其本质上是一个对象,对象内含有一个指针成员
string * pt,这是智能指针最基本的数据,为了防止悬挂指针的出现,我们使用了一个记数变量
int use,有了这个记数变量,我们可以以它为标准,决定是否释放这个智能指针。
这里让我想起Java变量释放的机制,同样有一种方法是通过记录对象引用数来决定对象是否应该被释放的。这与智能指针在思想上是一样的。
class ComputerClass { private: SmartPtr *ptr; //智能指针 int prise; int levels; public: //定义默认构造函数 ComputerClass (): prise(0), levels(0){ ptr = new SmartPtr("微软"); ptr->use++; } //定义构造函数 ComputerClass (const string& s, int p, int l): prise(p), levels(l) { ptr = new SmartPtr(s); ptr->use++; } //定义复制构造函数 ComputerClass(const ComputerClass& com) : prise(com.prise), levels(com.levels) { ptr = com.ptr; ptr->use++; } //定义析构函数 ~ComputerClass() { /* 当我们编写析构函数的时候,合成析构函数仍然进行。p414 假如合成析构函数会再继续执行,那么指针会不会被其强制delete呢? */ cout << "析构函数调用use=" << ptr->use-1 << endl; if (--ptr->use == 0) delete ptr; } //重载赋值操作符 ComputerClass& operator= (const ComputerClass& ); /* 为什么要返回一个引用? 因为这是一个成员函数,成员函数中this指针就是左操作数对象,在这个函数尾部,return *this */ //重载箭头操作,就某种情况而言,重载箭头操作的应该并没有那么直接: /* 1、我们可以任意定义重载操作符的返回对象(指针或者重载了箭头操作符的对象)所以这是一个十分自由的操作。 2、这个操作符返回的类型限定为指针(或定义了箭头操作的对象),因为的那个我们运行箭头操作符时,程序会递归地运行到最后的指针,并真正地使用一次箭头操作。 */ SmartPtr *operator-> () { return ptr; } };
以上代码是完整的使用智能指针的代码。我不详细解释了,可以在其中看到,为了配合智能指针的使用,我必需在ComputerClass类的各个构造函数和复制构造函数、析构函数中调整智能指针的use值。
重载操作符,其实我觉得是一个简单的C++语法而已。我在这里使用重载操作符,是希望对外隐藏智能指针的存在。譬如,我会在重载的过程中设置use的值。这也是重载的一个重要的作用,完成我们需要完成功能。
写在最后:智能指针的具体作用,其实我并没有什么深入地去探讨,现实懂,然后有一天做项目时发现,用智能指针可以克服一个棘手的问题。那就真是是懂了。
相关文章推荐
- C++ sizeof的使用总结
- C++之多态性与虚函数
- C++项目实践-银行储蓄系统
- iOS C语言7_结构体
- C++中inline这个玩意儿
- C 语言 字符串处理函数的实现
- KMP算法的一个C++实现
- C++ const 与 volatile
- C++ 全局变量 局部变量 静态变量 及 extern
- 一个简单二叉树的C++实现(一)
- 【多文件操作】使用C++筛选合并多文件的尝试
- C语言编程基础9
- 搬寝室
- 【leetcode c++】82 Remove Duplicates from Sorted List II
- 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
- 【leetcode c++】83 Remove Duplicates from Sorted List
- UVa1593 字符串处理
- 【leetcode c++】80 Remove Duplicates from Sorted Array II
- C++访问控制
- int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至 数组前面并保持有序,返回值为原数据中第一个