• 2006-10-17

    inside the c++ object model 点滴四 - [C&C++]

       1 针对数组的new semantic
          int *p_array=new int[5];
        上述表达式只是声明了5个int 指针,并没有初始化(调用vec_new()).
        还需要注意的是避免一个base class 指针指向一个drived class objects 所组成的数组.

        2 template 中的名称决议方式.
         支持两种方式
           2.1 scope of the template definiton
           2.2 scope of the template instantiation
           // 情况一
           extern double foo(double)
           template <class type>
           class Scop
            {
              public:
                 void invariant()
                {
                    _member=foo(_member);
                 }
              type type_dependent()
                {
                    return foo(_member);
                  }
                 //.....
                 private :
                    int _val;
                    type _member;
            }
            // 情况二
            extern int foo(int);
            Scope<int> sro;
            sro.invariant(); //  会调用那一个foo呢?
            答案是 extern double foo(double);
        规则如下
            对于一个nomember name 的决议是根据这个name的使用是否与“用以具现出该template的参数类型”有关而决议的.如果不相关那么就义declaration来决定name,反之以instantiation来决定name.
            即如果 sro.type_dependent();  那么调用 foo(int );
         3 template 具现方式一般有两种
            3.1 编译期决定
            3.2 链接时决定
         4  安全的动态转型
            dynamic_cast可以保证在执行期决定真正的类型,对于pointer是安全的,如果成功传回地址否则传回0.
           而对于reference 要不传回正确要不发生异常.如果不希望进行异常捕捉那么可以用typeid 函数 判断后在进行转化
           try{
                 fct &rf=dynamic_cast<fct &>(rt);
                   //...            
            }
           catch(bad_cast)
           { .....}
        // 使用typeid
           if(typeid(fct)==typeid(rt))
        {
            fct &rf=dynamic_cast<fct &>(rt);
           //....
          
            }
          
       
    分享到:

    历史上的今天: