【C++】Vs2008中使用智能指针

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实现转换。

例子如下:

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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值