首页 > 代码库 > C++学习之路: 智能指针入门
C++学习之路: 智能指针入门
引言: 编写智能指针的要点:
a) 构造函数接收堆内存
b) 析构函数释放内存
c) 必要时要禁止值语义。
d) 重载*与->两个操作符
1 #ifndef START_PTR_H 2 #define START_PTR_H 3 4 #include <iostream> 5 using namespace std; 6 7 class Animal 8 { 9 public:10 Animal() { cout << "Animal" << endl ;}11 ~Animal() { cout << "~Animal" << endl; }12 13 void run() { cout << "Animal is running....." << endl; }14 15 }; 16 17 18 19 20 class SmartPtr21 {22 public:23 SmartPtr(Animal * ptr = NULL) //采用缺省函数24 :ptr_(ptr) 25 {26 27 }28 29 ~SmartPtr()30 {31 delete ptr_ ;32 }33 34 Animal &operator*() //需要重载一个const 版本,否则const SmartPtr 无法解引用35 {36 return *ptr_ ;37 }38 const Animal &operator*() const39 {40 return *ptr_ ;41 }42 43 Animal *operator->()44 {45 return ptr_ ;46 }47 const Animal *operator->() const48 {49 return ptr_ ;50 }51 private:52 SmartPtr(const SmartPtr &other)53 :ptr_(other.ptr_)54 {55 56 }57 SmartPtr &operator=(const SmartPtr &other) 58 {59 if(this != &other)60 {61 ptr_ = other.ptr_ ;62 }63 return *this ;64 }65 66 Animal *ptr_ ;67 } ;68 69 #endif /*START_PTR_H*/
测试代码:
1 #include "smartPtr.h" 2 #include <iostream> 3 using namespace std; 4 5 int main(int argc, const char *argv[]) 6 { 7 { 8 SmartPtr ptr(new Animal) ; //这个智能指针的生命周期仅限于这个花括号内部, 那么它 持有的对象 的生命 也只存在于这对括号中 9 ptr->run() ; //因为智能指针的构造函数中对持有对象进行定义, 在智能指针析构 函数中对持有对象进行释放, 实现自动化管理获取的资源10 }11 return 0;12 }
AnimalAnimal is running.....~Animal
打印结果, 智能指针实现了内存的自动管理
总结:
其实
智能指针是个类对象,但是行为表现的像一个指针。它有三种操作符
a) . 调用的是智能指针这个对象本身的方法。
b) * 调用的是 解引用出持有的对象
c) -> 调用的是 调用持有对象内部的成员
C++学习之路: 智能指针入门
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。