• 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++!(狗头)

  • 相关阅读:
    【Vue3.0移动端项目--旅游网】--项目初始化搭建
    LeetCode 310 周赛
    复旦MBA项目GNW海外课程|连线全球顶尖商学院,跨时空学习精彩无限!
    Qt,C++中QString,string,char数组等常用格式转换大总结
    [附源码]java毕业设计大学生心理咨询网站
    【工具篇】Unity内置渲染管线和URP以及HDRP轮廓外发光边缘光高亮显示演示
    实战真知 | 金融企业如何深度融合云原生技术?
    图见-未来 | 创邻科技 Galaxybase免费版发布会回顾
    Jenkins-Slave使用Centos安装的OpenJDK
    java毕业生设计药房药品采购集中管理系统计算机源码+系统+mysql+调试部署+lw
  • 原文地址:https://www.cnblogs.com/binarch/p/17481652.html