乐趣区

关于c++:C面试八股文在C中有哪些可执行体

某日二师兄加入 XXX 科技公司的 C ++ 工程师开发岗位第 14 面:

面试官:在 C ++ 中,有哪些可执行体?

二师兄:可执行体?

面试官:也就是可调用对象。

二师兄:让我想一想。函数、函数指针、类的静态方法、类的成员办法、仿函数、lambda 表达式。

面试官:能说一说他们之间有什么区别吗?

二师兄:好的。函数是一段代码,执行特定工作,承受参数并返回值。

int add(int a, int b)
{return a + b;}

二师兄:函数指针是指向函数的指针。

int add(int a, int b)
{return a + b;}

using addptr = int(*)(int,int);
addptr ptr = &add;    // 函数指针
int sum = addptr(1,2);

二师兄:类的静态方法和函数基本一致,只不过此静态方法属于整个类所有。而成员办法则只能通过类的实例来调用。

class Foo
{
public:
    static int add(int a, int b) {return a + b;}    // 静态方法
    int add2(int a, int b) {return a + b;}        // 成员办法
};
int sum1 = Foo::add(1,2);
Foo f;
int sum2 = f.add2(2,1);

二师兄:仿函数是一个类或构造体,重载了 () 运算符。

struct Add
{int operator()(int a, int b) {return a+ b;}  
};

int sum = Add()(1,2);

二师兄:lambda表达式在 C ++11 时被引入,实质上是是一个匿名函数。

auto add = [](int a, int b) {return a + b;};
int sum = add(1,2);

//or
int a =1 , b = 2;
auto ladd = [a,b](){return a + b;};
int sum = ladd();

面试官:你晓得std::function?

二师兄:哦,这个规范也是在 C ++11 引入的,它的对象能够把以上所说的可执行体保存起来。

std::function<int(int,int)> add_fun;
add_fun = add;
add_fun = ptr;
add_fun = Foo::add;
add_fun =std::bind(&Foo::add2,&f,std::placeholders::_1,std::placeholders::_2);
add_fun = Add();
add_fun = ladd;

面试官:那你晓得以上可执行体之间的性能有何差异吗?

二师兄:额,性能应该差不多吧。。

面试官:好的,回去等告诉吧。

今日二师兄的体现不错,让咱们看一下面试官的最初一个问题:

晓得以上可执行体之间的性能有何差异吗?

从性能上讲,函数、类的动态 / 成员办法(非虚办法)、仿函数和 lambda 表达式的性能基本相同,而函数指针和 std::function 的性能要差一些。因为函数指针和 std::function 的实例没有方法被内联。

好了,今日份面试到这里就完结了。让咱们一起期待今天二师兄的体现吧。

关注我,带你 21 天“精通”C++!(狗头)

退出移动版