400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

c++对象模型 模板 异常处理 执行期类型识别

template

声明

​ 当我们声明一个template class、template class memberfunction等,会发生何事?

成都创新互联公司是专业的明山网站建设公司,明山接单;提供网站设计、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行明山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

​ 现有如下片段:

template 
class Point
{
public:
    enum Status{ unallocated, normalized };
    
    Point( Type x = 0.0, Type y = 0.0, Type z = 0.0 );
    ~Point();
    
    void* operator new( size_t );
    void operator delete( void*, size_t );
    
    //...
    
private:
    static Point *freeList;
    static int chunkSize;
    Type _x, _y, _z;
}

​ 声明一个template class,在程序中编译器对其并没有任何反应。换句话说,上述的data member其实并不可用

实例化

Point::Status s;

Point::freeList;

//如下会产生第二个freeList实例
Point::freeList;

//定义指针指向特定实例,程序中啥也没发生。因为编译器不需要知道与该class有关的任何member数据,也没必要初始化template实例,且指针可以为0
Point< float >* ptr = 0;

//reference则不同,它需要实例化,因为reference是需要绑定对象的
const Point& ref = 0;

//扩展
Point temp( (float) 0 );
const Point& ref = temp;

//导致实例化
const Point origin;

​ 对于int和long相同的架构中,以下两个实例化c++standard并未对此进行强制规定应实例化一个还是两,不过大部分编译器都是实例化两个:

Point pi;
Point pi;

名称决议

异常处理

​ 现有一函数含有对一块共享内存的locking和unlocking操作,此时异常处理不保证能正确运行:

void mumble( void* arena )
{
    Point* p = new Point;
    smLock( arena );
    
    //若此处有exception被抛出,会产生问题
    //...
    
    smUnLock( arena );
    delete p;
}

//因此我们需要安插default catch子句
void mumble( void* arena )
{
    Point* p = new Point;
    smLock( arena );
    
    try
    {
        smLock( arena );
    }
    catch(...)
    {
        smUnLock( arena );
        delete p;
        throw;
    }
    
    smUnLock( arena );
    delete p;
}

​ 当一个exception发生时,编译系统必须完成以下:

  1. 检验发生throw操作的函数
  2. 决定throw操作是否发生在try区段
  3. 若是,编译系统必须把exception type拿来和每个catch子句比较
  4. 若比较后吻合,流程控制交给catch子句
  5. 若throw的发生不在try区段,或没有一个catch子句吻合,那么系统必须摧毁所有active local objects,从堆栈中将目前的函数推离,到下一个函数。再重复2-5

执行期类型识别


分享题目:c++对象模型 模板 异常处理 执行期类型识别
网页链接:http://mbwzsj.com/article/dsoiego.html

其他资讯

让你的专属顾问为你服务