码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++面试八股文:技术勘误


    不知不觉,《C++面试八股文》已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉。

    为了不误导更多的小伙伴,以后会不定期的出勘误文章,请各位小伙伴留意。

    在《C++面试八股文:C++中,设计一个类要注意哪些东西?》一文中,

    #include 
    struct Foo{};
    struct Goo
    {
        void f1(Foo& f){std::cout <<"non const function" << std::endl;}	
        void f1(const Foo& f){std::cout <<"const function" << std::endl;}
    };
    int main(int argc, char const *argv[])
    {
        Foo foo;
        Goo goo;
        goo.f1(foo);    //无法通过编译,error: ‘void Goo::f1(Foo)’ cannot be overloaded with ‘void Goo::f1(Foo)’
        return 0;
    }
    

    这里的例子f1和f2方法的参数应该是Foo f和const Foo f,这才是顶层const。在此感谢知乎用户 退乎 的提醒。

    在《C++面试八股文:std::string是如何实现的?》一文中,

    有std::string重载的相关问题,我已经在 技术勘误:《C++面试八股文:std::string是如何实现的?》 一文中做了详细说明,在此再次感谢知乎用户 庄严 的指正。

    在《C++面试八股文:override和finial关键字有什么作用?》一文中,final 误拼为 finial,感谢知乎用户 DiaoYan 的指正。

    同时,这张内存布局图也有错误,

    file

    应该是这样的:

    file

    感谢知乎用户 清越 的指正。

    在《C++面试八股文:std::vector了解吗?》一文中,

    面试官:push_back和emplace_back有什么区别?

    除了文中所说的不同点,还要一点:emplace_back可以传入构造函数构造对象,而push_back只能拷贝或移动对象。

    感谢知乎用户 选择公理 的指正。

    在《C++面试八股文:std::vector和std::list,如何选择?》一文中,

    以下代码的输出是什么?

    #include 
    #include 
    int main(int argc, char const *argv[])
    {
        std::list<int> li = {1,2,3,4,5,6};
        for(auto it = li.begin(); it!= li.end(); ++it)
        {
            if(0 == *it % 2) li.erase(it);
        }
        for(auto& i : li) std::cout << i << " ";
        std::cout << std::endl;
    }
    

    这里给出的答案是有问题的:

    erase函数返回下一个有效迭代器,所以可以把if(0 == *it % 2) li.erase(it)修改为if(0 == *it % 2) it = li.erase(it)来解决这个问题。

    这里的erase返回的是下一个迭代器,然后++就是下下个迭代器,跳过了下个迭代器。但是上面代码中%2 == 0 也会跳过下个奇数,所以无法暴露这个问题。应该改成:

    #include 
    #include 
    int main(int argc, char const *argv[])
    {
        std::list<int> li = {1,2,3,4,5,6};
        auto it = li.begin();
        while(it!= li.end())
        {
            if(0 == *it % 2) 
            {
                it = li.erase(it);
            }else{
                ++it;
            }
        }
        for(auto& i : li) std::cout << i << " ";
        std::cout << std::endl;
    }
    

    感谢知乎用户 潸然 的指正。

    在《C++面试八股文:什么是构造函数?》一文中,

    面试官:可以使用virtual修饰构造函数吗?

    二师兄:不可以,因为构造函数在对象构造阶段调用,虚表尚未建立,所以无法调用虚函数实现多态。

    这里的描述是有问题的,虚表是在编译期生成,在构造函数执行时,可能还没有被初始化。所以无法调用虚函数实现多态。

    感谢知乎用户 handsome奶酪 的指正。

    在《C++面试八股文:什么是空指针/野指针/悬垂指针?》一文中,

    面试官:你知道0/NULL/nullptr三者之间的区别吗?

    二师兄:虽然三者都能定义空指针,但三者类型不同。

    二师兄:0是int类型,NULL在g++下是一个宏定义,而nullptr是有类型的;

    #define NULL ((void *)0)
    

    这里的定义也是有问题的,完整的定义如下:

    #if defined (_STDDEF_H) || defined (__need_NULL)
    #undef NULL /* in case  has defined it. */
    #ifdef __GNUG__
    #define NULL __null
    #else /* G++ */
    #ifndef __cplusplus
    #define NULL ((void *)0)
    #else /* C++ */
    #define NULL 0
    #endif /* C++ */
    #endif /* G++ */
    #endif /* NULL not defined and  or need NULL. */
    #undef __need_NULL
    

    在GCC11下,是 __null, 类型是long。所以sizeof(NULL) == 8。

    再再再次感谢 庄严 大佬的指正。

    感谢小伙伴们的的反馈,这对我来说非常宝贵。不仅帮助我改正了文章中的错误,也让我有机会更新和修正自己的知识储备库。

    C++的标准繁杂,不同版本的标准可能有所出入。同时不同编译器对标准的实现也不尽相同,这增加了C++学习者的负担。

    前路坎坷,吾辈不可因为荆棘密布望而却步。

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

  • 相关阅读:
    clustershell
    Java21 + SpringBoot3集成七牛云对象存储OSS,实现文件上传
    Node.js | 详解 Cookie-Session登录验证 的工作原理
    高效技巧揭秘:Java轻松批量插入或删除Excel行列操作
    3DEXPERIENCE® SOLIDWORKS® 新功能
    STM32单片机IC卡指纹密码锁门禁系统GSM短信报警
    多线程环境下事务与锁的问题
    【终端】记录mbedtls库的重新安装
    瑞云介绍使用ZBrush和Marmoset工具包制作的风格化巨怪战斗机
    【零基础入门MyBatis系列】第五篇——手写MyBatis框架
  • 原文地址:https://www.cnblogs.com/binarch/p/17520184.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号