STL初学

模板函数的可移植性:
只有在头文件中以inline function的方式实现template function。
而目前,template必须定义在头文件中。

非类型模板参数Nontype Template参数:
bitset的使用是,传入数值而非类型参数,代表位集的大小。
缺省的模板参数:

关键字:typename
如果typename T::subType *ptr;  限定class T中定义的类型 subType
其次,typename  可以替换关键字class。  -》》最开始就是使用class为了不引入typename关键字。

成员模板:
类的成员函数可以是一个模板,但是这样的模板它是virtual ,也不能有缺省参数的。
模板构造函数是成员模板的一种特殊形式,通常在复制对象时进行了隐式类型转换,它不隐藏隐式的拷贝构造函数。

嵌套类本身也可以是一个template。

基本类型的显式初始化:
如果采用不带参数的、明确的构造函数,基本类型会被初始化为0,否则为未定义的值。这个在模板中使用相当好,当你不知道基本类型是哪一种类型,不能使用=0直接初始化,而采用它不带参数的明确的构造函数初始化。
T x = int T();

2.异常处理
class Error;
void f(){
 ....
 if(exception-condition)
  throw Error();
}
异常处理的过程:
当遇到throw语句后,开始了堆栈辗转开解的过程(stack unwinding)。对应的函数区段会发生类似于return的返回操作,这个区段的所有局部对象会调用相应的析构函数。这个stack unwinding过程会持续到退出main()函数或者直到遇到某个catch子句捕捉并处理该异常。

异常处理的概念:
异常对象可以是基本类型,也可以模板类。可以运用异常处理的状态,将异常消息从异常被侦查到的地方送到异常处理的地方。

异常规格:某个函数可能抛出那些异常。C++函数库提供了一些通用的异常处理特性,如标准异常类型、auto_ptr类型。

C++标准库由不同成分构成,来源不同,设计和实现的风格也不同。
string类就有它具体的错误处理,检查所有可能的错误与异常。而其他部分,如STL和vararrays中效率重于安全,几乎不检验逻辑错误,并且只在执行时发生错误时才抛出异常。

标准异常standard exception classes:
语言本身和标准库抛出的异常,都派生自基类exception,包括:语言本身支持的异常,C++标准库抛出的异常,程序作用域之外发出的异常:
1.bad_alloc 
  全局操作符new操作失败
2.bad_cast
 dynamic_cast失败抛出
3.bad_typeid
4.logic_error: domain_error, invalid_argument, length_error, out_of_range
  C++标准库中抛出的异常都派生自logic_error.
5.ios_base::failure
 数据流错误
6.runtime_error: range_error, overflow_error , lowflow_error
 程序作用域之外的异常:内部计算的区间错误,计算时候的上溢错误和下溢错误
7.bad_exception
  发生非预期的异常,bad_exception都会接手
class E1;
f() throw(E1,bad_exception){  //exception specification 异常规格
}

member of exception class:
所有标准异常的接口只含有一个成员函数:what(),用于获取类型以外的附加信息,返回一个null结束的字符串。
namespace std{
 class exception{
  public:
  virtual const char* what() const throw();

唯一通用的异常处理手段,一通打印而已:
try{
}
catch(const std::exception& error){
 std::cerror>>error.what()>>std::endl;
}

程序员标准异常:
namespace std{
 class logic_err:public exception{
  public:
  explicit logic_error(const string& whatStr);
只有logic_error及其派生类、runtime_error及其派生类、ios::failure,可用字符串初始化这样的异常 。

如:
string s;
......
throw std::out_of_range(s);   or   std::out_of_range("......some  string.....");

可以从标准的异常类中派生出自己的异常类:
第一类:重定义虚函数what()
class Myproblem : public exception{
 public:
 Myproblem();
 const char* what() const throw(){           //重定义父类virtual函数
 ...........

   throw Myproblem();
第二类:构造新的异常类构造函数
 class MyRangeProblem : public std::out_of_range{
  public:
  MyRangeProblem(const string& whatStr): out_of_range(whatStr){
  .......
........................
 throw MyRangeProblem(".........");

4.命名空间

越来越多的软件由程序库、模块和组件组合而成。namespace用来避免可能的名称冲突。
namespace具有拓展开放性,可以出现在任何源码文件中。

命名空间定义的是逻辑模块,而不是实质的模块。在UML和其他的建模表示法中,模块被描述为package。

如果函数中的一个或多个参数已经被定义在函数所处的命名空间中,那么就没有必要再为函数指定namespace了。

如果场合不清楚,不应该使用using申明,所以在头文件中使用using是十分不明智的。

namespace的使用:
1.直接指定标识符   std::iostream
2.using declaration        using std::cout ;
3.using directive          using namespace std;       使std中所有标识符都曝光
      在使用场合不明确的情形下避免using directive。

5. C++对于bool类型的支持
0为false,非0为true。  还支持bool类型与整型的自动转换。

6.关键字explicit
作用:禁止单参数构造函数被用于自动类型转换。
典型的群集类型,如stack。

class Stack{
 explicit Stack(const int size);
}

如果没有explicit关键字,那么一下代码是没有编译错误的。

Stack s; 。。。。。;s = 40;
发生自动类型转换,s被指派给一个size为40的stack。

添加了explicit:
Stack s1 = Stack(40);   //ok        explicit conversion
Stakc s2 = 40           //now error    implicit conversion
 
7.new type conversion operators

static_cast:利用原值重建一个临时对象,只有当这种转换有所定义,转换才会成功
dynamic_cast:将多态类型(polymorphic type)向下转型(down cast)为其实际静态类型。
             唯一在执行期进行检验的转型动作,可用来检验某个多态对象的类型。
     转型失败会抛出一个bad_cast异常。
const_cast:用来添加或者取消对象的静态性constness,也可以用来去掉volatile饰词
reinterpret_cast:操作行为由编译器决定,不确定性带来了可移植性的丢失。

():老式的类型转换,可以替代除dynamic_cast之外的三种转换符,无法给予确定的信息,不推荐使用。

8.常数静态成员的初始化
  推荐 在定义时候初始化。

9.头文件
#include C++风格的不带后缀的头文件。
string头文件 : 字符串          cstring :char*  函数

10.配置器Allocators
采用特殊对象来处理内存配置和寻址,这样的对象称为配置器。它体现出一种特定的内存模型,成为一种抽象表征,表现为“内存需求”到“内存低阶调用”的转换。
通过在程序中使用不同的配置器,就可以使用不同的内存模型。
配置器现在作为一宗技术方案的基础,使得诸如shared memory、garbage collection、object oriented databases等特定的内存模型拥有一致的接口。

C++程序库定义了一个缺省的配置器(Default Allocator)。缺省配置器可以在任何“配置器被当做参数适用的地方”担任默认值。
缺省配置器会执行内存分配和回收的一般性手法:调用new和delete。
绝大数程序都采用缺省配置器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值