CAutoPtr和CAutoVectorPtr

  C++程序员一定很熟悉CAutoPtr,至少它是我接触到的第一个智能指针,而且这个指针转移控制权,这是它非常大一个特色,ATL里也有这个,和STL里是一个东西,只不过这个没有支持异常(没有编译进去)。CAutoVectorPtr是只能数组指针,特别地,它没有构造函数,所以使用起来要分为声明和分配两步。
	CAutoPtr
  
  	pap(new SomeClass);
	pap->doSomeThing();
	
	//##CAutoPtr
	//A.CAutoPtr构造函数和析够函数,CAutoPtr一共有4个构造函数
	//1.构造默认NUL指针函数
	CAutoPtr
  
  	pap1;
	//2.拷贝构造
	CAutoPtr
  
  	pap2(pap1);	//所有权转移给pap2.
	//3.兼容构造,就是用一个可转型的类型指针进行构造,一般来说,这种转型必须是继承链上的类型向上转型
	CAutoPtr
  
  	temppap;
	CAutoPtr
  
  	pap3(temppap);
	//4.直接由裸指针进行构造,这里有个常用的小技巧就是传递new XXX(),其实就是传递了裸指针,不要在读代码的时候觉得晦涩
	CAutoPtr
  
  	pap4(new SomeClass());
	//5.CAutoPtr的析够函数简单进行了delete指针并赋NUL的操作,即使多次调用,也没问题的,因为C++里,delete NULL没问题
	pap4.Free();	//其实是多余调用,除非你特别想删除现在的指针,析够函数里它还会被调用

	//B.CAutoPtr的赋值操作
	//1.可转换类型间的赋值操作
	pap3	= temppap;		//一定要记住,CAutoPtr的赋值转移所有权,另外赋值操作也会清理原有指针,另另外,赋值操作也进行了自身检测
	//2.同类型的转换
	pap1	= pap2;			//一定要记住,转移所有权丷丷

	//C.CAutoPtr定义了转换操作符,因而可以像使用常规指针的样式一样使用CAutoPtr
	pap->doSomeThing();

	//D.比较操作
	//指针直接可以比较以确定是否同一指针,CAutoPtr定义了==和!=
	if (pap1 == pap2)
	{
	}
	if (pap1 != pap2)
	{
	}

	//##CAutoVectorPtr
	//1.CAutoVectorPtr多数时候和CAutoPtr的操作一样,但是,CAutoVectorPtr没有构造函数,CAutoVectorPtr定义了一个Allocate方法
	CAutoVectorPtr
  
  	avp1;	//只是定义了CAutoVectorPtr
	avp1.Allocate(100);			//在这里才实际分配空间

	//2.CAutoVectorPtr未定义operator->,因此只能使用原生操作
	((int*)avp1)[5]	= 5;

	//3.一个限制:CAutoVectorPtr的Allocate方法必须使用类的默认构造函数构造vector,如果没有无参数的默认构造函数,那不能使用CAutoVectorPtr

	//4.CAutoVectorPtr也是自管理资源的,如果你非调用Free,那也没什么问题,毕竟你可能想释放内存
	avp1.Free();	//你可以这样使用,但是没有必要,除非你特别想释放内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值