zoukankan      html  css  js  c++  java
  • 第67课.经典问题解析五

    1.编写程序判断一个变量是不是指针

    知识点:c++中仍然支持C语言中的可变参函数
    c++编译器的匹配调用优先级:
    a.重载函数(1)
    b.函数模板(2)
    c.变参函数(3)

    补充知识点:
    当sizeof求函数的值时(sizeof(函数)),得到函数返回值类型的大小,不会去调用函数

    eg:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Test
    {
    public:
        Test()
        {
        }
        virtual ~Test()
        {
        }
    };
    
    template < typename T >
    char IsPtr(T* v)        // 优先匹配,能匹配普通指针,不能匹配类指针
    {
        return 'd';
    }
    
    int IsPtr(...)          // 上诉匹配不成功时,匹配,不能匹配类。当类试图进行匹配时报错
    {
        return 0;
    }
    
    /*  仅仅上诉情况只能分辨除类指针以外的其他指针
     *  变参函数无法解析对象参数,会造成程序崩溃
     *  解决:
     *  因为正常运行时,匹配到变参函数,变参函数就会被调用,去运行。当运行时
     *  发现类对象无法解析。程序崩溃。
     *  这时我们使用sizeof,不去调用函数,则不会崩溃。反而能根据返回类型进行判断
     */
     
    #define ISPTR(p) (sizeof(IsPtr(p)) == sizeof(char))
    
    int main(int argc, char *argv[])
    {
        int  i = 0;
        int* p = &i;
        
        cout << "p is a pointer:" << ISPTR(p) << endl;      // 1
        cout << "i is a pointer:" << ISPTR(i) << endl;      // 0
     
        Test t;
        Test* pt = &t;
        
        cout << "pt is a pointer: " << ISPTR(pt) << endl;    // 1
        cout << "t is a pointer: " << ISPTR(t) << endl;      // 0
        return 0;
    }
    

    2.如果构造函数中抛出异常会发生什么情况?

    构造函数中抛出异常
    a.构造过程立即停止
    b.当前对象无法生成
    c.析构函数不会被调用
    d.对象所占用的空间立即收回

    工程项目中的建议:

    a.不要在构造函数中抛出异常
    b.当构造函数可能产生异常时,使用二阶构造模式

    3.在析构函数中抛出异常

    析构函数中抛出异常,会导致对象所使用的资源无法完全释放!!!

  • 相关阅读:
    创建vlan 和 节点vlan 连通性排查
    FRRouting SR-MPLS
    mpls over gre
    linux mpls
    交换机vlan
    neutron subnet + router
    neutron 层次绑定 +binding_levels
    frrouting命令补全 + 启动失败排查
    Paper Pal:一个中英文论文及其代码大数据搜索平台
    游戏服务器设计 Unity3d + photon + grpc + nodejs + postgis/postgresql
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/12039880.html
Copyright © 2011-2022 走看看