您的位置:首页 > 编程语言 > C语言/C++

C++智能指针与重载操作符

2015-07-18 09:57 288 查看
简单记录一下C++的智能指针和重载操作符

智能指针

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的值。这也是重载的一个重要的作用,完成我们需要完成功能

写在最后:智能指针的具体作用,其实我并没有什么深入地去探讨,现实懂,然后有一天做项目时发现,用智能指针可以克服一个棘手的问题。那就真是是懂了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: