【C++】Vs2008中使用智能指针
2016-04-15 16:07
1151 查看
Tr1模块是C++11正式诞生前夕,已经确定加入新标准的C++特性。Vs2008算是C++11标准正式诞生前夕,对C++03和tr1标准支持的最好的一个IDE,是相当经典的一版,很多程序的开发和维护都还是使用vs2008。Vs2008要使用tr1标准,需要安装sp1补丁;在代码中使用tr1标准,需要加入tr1::前缀,如std::tr1::shared_ptr。符合C++11标准的编译器则可以直接使用,比如std::shared_ptr。
Vs2008sp1的tr1模块中,已经添加了诸如智能指针、正则表达式、哈希表、随机数生成器等特性。最常使用的智能指针是std::tr1::shared_ptr。
智能指针和普通指针在多态性上相似,都能从派生类指针自动隐式转换到基类指针(向上转换),不能自动从基类指针转到派生类指针(向下转换)。普通指针通过dynamic_cast函数实现向上向下转换,智能指针通过dynamic_pointer_cast实现转换。
例子如下:
Vs2008sp1的tr1模块中,已经添加了诸如智能指针、正则表达式、哈希表、随机数生成器等特性。最常使用的智能指针是std::tr1::shared_ptr。
智能指针和普通指针在多态性上相似,都能从派生类指针自动隐式转换到基类指针(向上转换),不能自动从基类指针转到派生类指针(向下转换)。普通指针通过dynamic_cast函数实现向上向下转换,智能指针通过dynamic_pointer_cast实现转换。
例子如下:
struct A{virtual void print(){printf("A\n");}}; struct B:public A{virtual void print(){printf("B\n");}}; typedef std::tr1::shared_ptr<A> baseptr; typedef std:: tr1::shared_ptr<B> derivedptr; void foo1(A* a){printf("foo1: ");a->print();} void foo2(B* b){printf("foo2: ");b->print();} void foo3(baseptr a){printf("foo3: ");a->print();} void foo4(derivedptr b){printf("foo4: ");b->print();} int main(){ A* bp1 = new B; B* dp1 = new B; baseptr bp2 =derivedptr(new B); derivedptr dp2 =derivedptr(new B); foo1(bp1); //foo2(bp1);//基类指针不能自动转换为派生类指针 //foo2(dynamic_cast<B>(bp1));//dynamic_case函数实现类型转换,B指针不能转换为B对象 foo2(dynamic_cast<B*>(bp1)); foo1(dp1); foo2(dp1); foo3(bp2); //foo4(dynamic_cast<B>(bp2));// 智能指针不能用dynamic_cast转换 //foo4(dynamic_cast<B*>(bp2));// 智能指针不能用dynamic_cast转换 //foo4(dynamic_cast<derivedptr>(bp2)); //智能指针不能用dynamic_cast转换 foo4(std::tr1::dynamic_pointer_cast<B>(bp2)); foo3(dp2); foo4(dp2); delete bp1; delete dp1 }
相关文章推荐
- 关于volatile
- LeanCloud C++ SDK初步安装测试记录(2)
- C++ const用法 尽可能使用const
- 巩固C语言(四)-----冒泡排序 & 二分查找 & 单次循环对二维数组赋初值
- C++多态篇3——虚函数表详解之多继承、虚函数表的打印
- MFC VC++多线程间通信
- C语言编写的PHP框架--yaf入门编程
- 【动态规划】复制书稿
- C++ cin学习笔记
- C++链表学习笔记
- c++添加swich case string 的支持
- leetcode(226)—— Invert Binary Tree(Python/C++)
- [C++][代码库]Vector3空间向量类
- C语言中 sqlite3 的 一些调用方式
- C++ function bind及策略模式
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- c语言编写cgi程序,无法加载lib文件的问题
- 自己用c++写的简单成绩管理系统框架
- c语言的学生成绩管理系统
- Tricks(三十七)—— C++ string类 split 的实现