六十七课 经典问题解析五

一、面试问题一

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

  • C++中依然支持C语言的可变参数函数
  • C++编译器的匹配调用优先级
  1. 重载函数
  2. 函数模板
  3. 变参函数

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、避免在析构函数中抛出异常

析构函数的异常将导致:对象所使用的资源无法完全释放

小结:

  1. C++中依然支持变参函数
  2. 变参函数无法处理对象参数
  3. 利用函数模板和变参函数能够判断指针变量
  4. 构造函数和析构函数中不要抛出异常

猜你喜欢

转载自blog.csdn.net/qq_34862658/article/details/82015003