《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()离开。
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()离开。