一、面试问题一
1、编写程序判断一个变量是不是指针
- C++中依然支持C语言的可变参数函数
- C++编译器的匹配调用优先级
- 重载函数
- 函数模板
- 变参函数
2、思路 :
- 将变量分为两类:指针 VS 非指针
- 编写函数:
- 指针变量调用时返回true
- 非指针变量调用时返回false
示例:指针判断
#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;
}
#define ISPTR(p) (sizeof(IsPtr(p)) == sizeof(char))
int main()
{
int i = 0;
int* p = &i;
cout << "p is a pointer: " << ISPTR(p) << endl;
cout << "i is NOT a pointer: " <<ISPTR(i) << endl;
Test t;
Test* pt = &t;
cout << "pt is a pointer: " << ISPTR(pt) << endl;
cout << "t is NOT a pointer: " << ISPTR(t) << endl;
return 0;
}
打印结果
程序分析:变参函数无法解析对象参数,所以我们采用sizeof的方式只匹配函数,但不进行实际调用。
二、面试问题二
1、如果构造函数中抛出异常会发生什么情况?
- 构造过程立即停止
- 当前对象无法生成
- 析构函数不会被调用
- 对象所占用的空间立即收回
2、工程项目中的的建议
- 不要在构造函数中抛出异常
- 当构造函数产生异常时,使用二阶构造模式
示例:
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test()" << endl;
throw 0;
}
virtual ~Test()
{
cout << "~Test()" << endl;
}
};
int main()
{
Test* p = reinterpret_cast<Test*>(1);
try
{
p = new Test();
}
catch(...)
{
cout << "Exception..." << endl;
}
cout << "p = " << p << endl;
return 0;
}
3、避免在析构函数中抛出异常
析构函数的异常将导致:对象所使用的资源无法完全释放
小结:
- C++中依然支持变参函数
- 变参函数无法处理对象参数
- 利用函数模板和变参函数能够判断指针变量
- 构造函数和析构函数中不要抛出异常