《C++标准程序库》读书笔记一

《C++标准程序库》读书笔记一
3一般概念

1、C++标准程序库的异常总是派生自logic_error,提供了以下几种逻辑错误类别:

(1)invalid_argument表示无效参数,例如将bitset(aarry of bit)以char而非‘0’或者‘1’进行初始化;

(2)length_error指出某个行为可能“超越了最大障碍”,例如对着某个字符串附加太多字符;

(3)out_of_range指出参数值“不在预期范围内”,例如字符串中采用了一个错误的索引;

(4)domain_error指出专业领域范畴内的错误。

另外:标准程序库的I/O部分提供了一个味ios_base::failure的特殊异常。

2、代码推荐采用标准异常。

3、异常类别的头文件

基础类别exception和bad_exception定义于 <exception>

bad_alloc定义于<new>

bad_cast和bad_typeid定义于<typeinfo>

ios_base::failure定义于<ios>

其他异常类别都定义于<stdexcept>

4、C++标准程序库定义了一个缺省配置器(default allocator)如下:

Namespace std {

         template<class T>

         classallocator;

}

缺省配置器可在任何“配置器得以被当做参数使用”的地方担任默认值,缺省配置器会执行内存分配和回收的一般性手法,也就是调用new 和delete操作符。
4 通用工具

1、  pair的定义在<utility>中,被定义为一个struct,所有的成员均为public类型,可以直接访问。

2、  可以使用便捷函数make_pair()生成一个pair对象,如

std::make_pair(42,’@’)

3、  std::auto_ptr声明在<memory>

std::auto_ptr<Widget>  ptr1(new Widget) //OK,初始化

std::auto_ptr<Widget>  ptr2 = new Widget ; //ERROR,不能用普通指针赋值初始化ptr2

std::auto_ptr<Widget>  ptr2 = std::auto_ptr<Widget>(new Widget)//OK,可以用其他ptr初始化ptr2

   std::auto_ptr<Widget> ptr3(ptr1);//OK, ptr1的所有权转移到了ptr3上面,从此ptr1失效 std::auto_ptr<Widget> ptr3(new Widget);ptr3 = ptr1;//OK,先delete ptr3所指的对象,然后将ptr1所指的对象转给ptr3

4、  关于auto_ptr使用的注意点:

(1)      auto_ptrs之间不能共享拥有权;

(2)      并不存在对array而设计的auto_ptrs;

(3)      auto_ptrs决非一个“四海通用”的智能型指针;

(4)      auto_ptrs不满足STL容器对其元素的要求;

(5)      如果要在函数形参避免auto_ptr的所有权转移,auto_ptrs类型要声明为const &。

(6)const auto_ptr类型的变量不能被其他auto_ptr赋值,但是所指的元素可以修改。

#include <memory>

#include <iostream>

using namespacestd;

template<typenameT>

ostream& operator<<(ostream& strm, const auto_ptr<T>&ap)

{

   if (ap.get() ==NULL)

   strm<<"NULL";

   else

      strm<<*ap;

   return strm;

}

int _tmain(intargc,_TCHAR*argv[])

{

   auto_ptr<int>p(newint (42));

   auto_ptr<int>q;

   cout<<"after intialization:" <<endl;

   cout<<"p: "<<p<<endl;

   cout<<"q: "<<q<<endl;

   q = p;

   cout<<"after assigning auto pointers:" <<endl;

   cout<<"p: "<<p<<endl;

   cout<<"q: "<<q<<endl;

   *q +=13;

   p = q;

   cout<<"after change and reassignment:" <<endl;

   cout<<"p: "<<p<<endl;

   cout<<"q: "<<q<<endl;

   return 0;

}

 运行:

after intialization:
p: 42
q: NULL
after assigning auto pointers:
p: NULL
q: 42
after change and reassignment:
p: 55
q: NULL

5、  辅助函数std::max和std::min均定义在<algorithm>文件中

6、  辅助性的“比较操作符”定义在<ultility>文件中,用户在使用时只需要在自定义类中定义“< ”和“==”二个操作符,在代码中声明using namespace std::rel_ops,就可以自动获取“>”和“!=”另外二个操作符的定义。

7、  函数exit()和abort()定义在<cstdlib>文件中,它们可以用来在任意 地点终止程序运行,无需返回main();

(1)      exit会销毁所有static对象,将所有缓冲区buffer清空flushes,关闭所有I/O通道channels,然后终止程序(之前会先调用经由atexit()登录的函数)。如果atexit()登录的函数抛出异常,就会调用terminate()。

(2)      abort()会立刻终止函数,不会做任何清理工作。

以上二个函数不会销毁局部对象localobjects,因为堆栈辗转开展动作(stack  unwinding)不会被执行起来。为确保所有局部对象的析构函数获得调用,应该运用异常exception或正常返回机制,然后再由main()离开。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值