第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.在析构函数中抛出异常

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

原文地址:https://www.cnblogs.com/huangdengtao/p/12039880.html