面试真题 | 小米智能座舱

自我介绍

介绍项目

static关键字,在类里面使用呢?

问题回答:static关键字在类里面的使用

在C++中,static关键字在类里面有多种用途,主要包括静态成员变量和静态成员函数。以下是详细解释:

静态成员变量

  1. 定义与声明

    • 静态成员变量在类内声明,但在类外定义和初始化。它不属于类的任何对象,而是属于类本身。
    • 声明时使用static关键字,如static int count;
    • 定义时在类外,如int ClassName::count = 0;
  2. 存储位置

    • 静态成员变量存储在全局数据区,而不是对象的内存空间中。
    • 因此,所有对象共享同一个静态成员变量的值。
  3. 访问方式

    • 可以通过类名和作用域解析运算符::来访问静态成员变量,如ClassName::count
    • 也可以通过对象来访问,但这不是推荐的做法,因为它可能引发误解。
  4. 用途

    • 常用于计数、记录类的实例数量、作为类内部的全局变量等。

静态成员函数

  1. 定义与声明

    • 静态成员函数在类内声明时使用static关键字,如static void display() {}
    • 它不属于类的任何对象,因此不能访问非静态成员变量或非静态成员函数(除非通过对象指针或引用传递)。
  2. 调用方式

    • 可以通过类名和作用域解析运算符::来调用静态成员函数,如ClassName::display()
    • 也可以通过对象来调用,但同样不是推荐的做法。
  3. 参数传递

    • 由于静态成员函数不能访问非静态成员,如果需要访问,通常通过参数传递对象指针或引用。
  4. 用途

    • 常用于实现与类相关的功能,但不依赖于特定对象的状态。
    • 如工厂函数、工具函数等。

面试官追问及相关回答

追问1

  • 问题:静态成员变量和静态成员函数与普通成员变量和成员函数的主要区别是什么?
  • 回答
    • 存储位置不同:静态成员变量存储在全局数据区,而普通成员变量存储在对象的内存空间中。
    • 访问方式不同:静态成员变量和成员函数可以通过类名直接访问,而普通成员变量和成员函数只能通过对象来访问。
    • 生命周期不同:静态成员变量在程序运行时一直存在,直到程序结束;而普通成员变量的生命周期与对象的生命周期相同。
    • 作用域不同:静态成员变量和成员函数的作用域是整个类,而普通成员变量和成员函数的作用域是类的实例。

追问2

  • 问题:在嵌入式系统中使用静态成员变量和静态成员函数有哪些需要注意的地方?
  • 回答
    • 注意内存使用:由于静态成员变量存储在全局数据区,如果大量使用静态成员变量,可能会导致内存占用过多。
    • 避免多线程冲突:在多线程环境中,如果多个线程同时访问同一个静态成员变量,需要采取同步措施来避免数据竞争。
    • 谨慎使用静态成员函数访问非静态成员:虽然可以通过参数传递对象指针或引用来访问非静态成员,但这会增加函数的复杂性和出错的可能性。因此,在设计类时,应尽量避免在静态成员函数中访问非静态成员。

追问3

  • 问题:能否给出一个使用静态成员变量和静态成员函数的实际例子?
  • 回答
    class Counter {
    public:
        // 静态成员变量,用于记录类的实例数量
        static int count;
    
        // 构造函数,每次创建对象时增加计数
        Counter() {
            count++;
        }
    
        // 析构函数,每次销毁对象时减少计数
        ~Counter() {
            count--;
        }
    
        // 静态成员函数,用于显示当前计数
        static void displayCount() {
            std::cout << "Current count: " << count << std::endl;
        }
    };
    
    // 在类外定义和初始化静态成员变量
    int Counter::count = 0;
    
    int main() {
        Counter obj1, obj2;
        Counter::displayCount(); // 输出:Current count: 2
        Counter* obj3 = new Counter();
        Counter::displayCount(); // 输出:Current count: 3
        delete obj3;
        Counter::displayCount(); // 输出:Current count: 2
        return 0;
    }
    
    这个例子展示了如何使用静态成员变量来记录类的实例数量,并使用静态成员函数来显示该数量。

智能指针?

智能指针回答

问题:请解释一下C++中的智能指针,并详细讨论其种类、工作原理以及使用场景。

回答

智能指针是C++中用于自动管理动态分配内存的一种机制,它通过封装原始指针并提供对资源的自动释放,从而避免了内存泄漏和悬空指针等问题。C++标准库提供了几种主要的智能指针,包括std::unique_ptrstd::shared_ptrstd::weak_ptr

  1. std::unique_ptr

    • 独占所有权的智能指针,不允许复制,只能移动。
    • unique_ptr被销毁或离开作用域时,它所指向的对象也会被自动删除。
    • 适用于需要确保只有一个所有者管理资源的场景。
  2. std::shared_ptr

    • 共享所有权的智能指针,允许多个shared_ptr实例共享同一个对象。
    • 使用引用计数机制来管理对象的生命周期,当最后一个shared_ptr被销毁或重置时,对象会被自动删除。
    • 适用于多个所有者需要共享资源的场景,但需要注意循环引用的问题。
  3. std::weak_ptr

    • 弱引用,用于解决shared_ptr之间的循环引用问题。
    • 不会增加对象的引用计数,因此不会延长对象的生命周期。
    • 可以从shared_ptr或另一个weak_ptr创建,但不能直接访问对象,必须通过lock()方法获取shared_ptr来临时访问对象。

工作原理

  • unique_ptr通过其析构函数来释放资源,当unique_ptr对象被销毁时,它会调用delete来释放其所指向的对象。
  • shared_ptr使用控制块(通常包含引用计数和指向实际对象的指针)来管理对象的生命周期。当shared_ptr被复制或赋值时,控制块会被共享,引用计数会增加。当shared_ptr被销毁或重置时,引用计数会减少。当引用计数变为0时,控制块和对象都会被释放。
  • weak_ptr不直接管理资源,而是指向shared_ptr的控制块。它不会增加引用计数,因此不会阻止shared_ptr所管理的对象被销毁。

使用场景

  • unique_ptr适用于需要确保资源独占所有权的场景,如动态数组、单例模式等。
  • shared_ptr适用于多个所有者需要共享资源的场景,如对象图、树形结构等。但需要注意避免循环引用。
  • weak_ptr通常与shared_ptr一起使用,用于解决循环引用问题,或在不增加引用计数的情况下观察对象的状态。

面试官追问及回答

追问1

  • 问题:请解释一下std::make_unique的作用,以及为什么推荐使用它而不是直接使用new来创建unique_ptr
  • 回答
    • std::make_unique是一个模板函数,用于创建并初始化一个unique_ptr。它接受与new相同的参数,并返回一个unique_ptr对象。
    • 推荐使用std::make_unique而不是直接使用new来创建unique_ptr的原因有几个:
      • std::make_unique更加简洁和直观,它直接返回unique_ptr,而不需要显式地调用new
      • std::make_unique是异常安全的。如果构造函数抛出异常,它不会泄漏内存,因为new表达式和unique_ptr的构造函数是作为一个原子操作执行的。
      • 使用std::make_unique可以避免潜在的内存泄漏问题。如果直接使用new来创建对象,然后再将其地址赋给unique_ptr,在赋值过程中如果发生异常,可能会导致内存泄漏。而std::make_unique则保证了在异常发生时不会泄漏内存。

追问2

  • 问题:在shared_ptrunique_ptr之间如何选择?请给出一些具体的选择依据。
  • 回答
    • 在选择shared_ptrunique_ptr时,需要考虑资源的所有权和管理方式。
    • 如果资源只需要被一个所有者管理,并且不希望其他代码能够访问或共享这个资源,那么应该

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

ARM/Linux嵌入式真题 文章被收录于专栏

让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。 因为技术知识工作中也会用到,所以踏实学习哦!!!

全部评论

相关推荐

我怀疑,我能进面试是个意外人家就没想面我也可能我表现太差。很短时间就结束了。自我介绍只会c和c++?讲一下简历上的通讯协议我写了好几个常用的都列上去了所以,这个问题我很懵我想就大概说说没有细说,然后我可能表达的不好,因为我说设计具体的协议帧就不展开了吧?总不能说把iic&nbsp;spi&nbsp;uart&nbsp;从头到尾讲一遍吧,我认为不至于吧,所以可能我这自以为是留下了不好印象,就后面就。。。我问都要展开吗,准备细讲他说其他的不用,can讲讲我这can答的不是很好tcp&nbsp;udp&nbsp;mqtt还会其他的吗?http。。说你学网络信息安全,协议什么的。。意思就是应该学了很多,不应该只会这些然后听到了我说http就问了嘴http&nbsp;和https的区别还有其他了解的吗没有了感觉常用的也没其他了吧?可能我孤陋寡闻安全,讲到我专业,问一些安全相关,攻击类型我完全没想到,我简历课程中也没有写安全相关,事实上也没有学太多安全相关,当时懵了,就没反应过来,就说了个ddos,没反应过来,安全攻击相关的一时也记不起来了。后面问了一个你经历中你认为最影响深刻或者感觉有进步的事这应该是标准问题吧后面差不多就结束了,感觉的出来,没啥想问的反问面试表现她说结果通过就通过啥的,没啥评价其实我是想了解下表现咋样答的好不好,表达清不清晰,有什么能提高什么的,改进什么的,缺陷什么的她估计理解错了,以为我想问结果,能不能过从中间开始我就感觉基本没机会了,一个是感觉到她没啥想问的,然后到确定她说没啥问的了就知道凉凉了,所有有这么一个提问然后我瞎问了一下,也没啥想问的其实,因为知道凉定了,并且对方也没有表现的很想说所以就拜拜,只有最后那句谢谢,感觉她真挺感谢我的,因为早早结束了面试,她轻松了😂记录下,其实有点被打击了的感觉。一种完全被看不上的感觉😰可能确实是完全不相关,岗位不匹配吧。
查看9道真题和解析
点赞 评论 收藏
分享
虾皮2025春招/2026暑假实习来了!可以帮查推进投递进度内推通道:内推码:NTA6tVc投递链接:https://app.mokahr.com/su/xoDeL校招入职虾皮快一年啦,不后悔自己选择了这家公司,进来一个月都在进行校招培训,公司提供了全方面的培训方案,能顺利帮助校招生过渡到工作的身份;除此之外组里面其他前辈都会很耐心解答!虾皮的公司福利:-work&nbsp;life&nbsp;balance-大厂薪资,外企性质-六险一金-每年15天年假-每年14天病假-每年都有调薪机会-零食饮料五折起-茶水间咖啡零食不限量这还不心动吗!25春招/2026暑假实习正式开始!2025春招招聘对象:毕业时间在2024年9月1日至2025年8月31日之间(中国大陆院校以毕业证为准,港澳台及海外院校以学位证时间为准)2026暑假实习面向对象:毕业时间在2025年9月1日至2026年8月31日之间的同学。投递时间:2025年3月5号开始每位同学可投递两个志愿,我们将优先按照第一志愿推进流程2025内推岗位:研发类:后端开发工程师前端开发工程师测试工程师算法工程师&nbsp;-&nbsp;AI方向算法工程师&nbsp;-&nbsp;自然语言处理方向算法工程师&nbsp;-&nbsp;计算机视觉方向算法工程师&nbsp;-&nbsp;搜广推方向产品经理&nbsp;-&nbsp;搜广推&amp;amp;amp;amp;内容方向产品经理&nbsp;-&nbsp;联盟营销方向大数据开发工程师SRE(运维)工程师业务安全策略工程师2026暑假实习岗位:后端开发工程师前端开发工程师测试工程师大数据开发工程师SRE(运维)工程师iOS开发工程师Android开发工程师算法工程师&nbsp;-&nbsp;AI方向算法工程师&nbsp;-&nbsp;配送方向算法工程师&nbsp;-&nbsp;搜广推方向算法工程师&nbsp;-&nbsp;机器学习方向技术产品经理产品经理产品运营产品设计数据分析base地:深圳、北京、上海#牛友职场人脉来了##内推##后端##春招##实习##牛友职场人脉来了#
虾皮信息
|
校招
|
56个岗位
点赞 评论 收藏
分享
评论
点赞
14
分享

创作者周榜

更多
牛客网
牛客企业服务