第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.当构造函数可能产生异常时,使用二阶构造模式