首页 > 编程语言 >C++面试八股文:技术勘误

C++面试八股文:技术勘误

时间:2023-07-01 23:45:07浏览次数:48  
标签:std 八股文 勘误 C++ li 面试 NULL

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

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

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

#include <iostream>
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;
}

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

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

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

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

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

file

应该是这样的:

file

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

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

面试官:push_backemplace_back有什么区别?

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

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

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

以下代码的输出是什么?

#include <iostream>
#include <list>
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 <iostream>
#include <list>
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三者之间的区别吗?

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

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

#define NULL ((void *)0)

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

#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL /* in case <stdio.h> 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 <stddef.h> or need NULL. */
#undef __need_NULL

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

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

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

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

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

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

标签:std,八股文,勘误,C++,li,面试,NULL
From: https://www.cnblogs.com/binarch/p/17520184.html

相关文章

  • 【C++】打开C++大门,踏入C++世界
    ☑️前言......
  • C++面试八股文:std::vector和std::list,如何选择?
    C++面试八股文:std::vector和std::list,如何选择?某日二师兄参加XXX科技公司的C++工程师开发岗位第24面:面试官:list用过吗?二师兄:嗯,用过。面试官:请讲一下list的实现原理。二师兄:std::list被称为双向链表,和C中手写双向链表本质上没有大的区别。list对象中有两个指针,一个指向......
  • 简约版八股文(day1)
    Java基础面向对象的三大基本特征封装:将一些数据和对这些数据的操作封装在一起,形成一个独立的实体。隐藏内部的操作细节,并向外提供一些接口,来暴露对象的功能。继承:继承是指子类继承父类,子类获得父类所有的非私有属性和方法,子类可继续拓展自己的属性和方法,这样就大大提高了代码的......
  • 利用ccache提高c++编译速度
    首先安装ccache:sudoaptinstallccache然后在cmake文件中添加如下代码即可:find_program(CCACHE_FOUNDccache)if(CCACHE_FOUND)set_property(GLOBALPROPERTYRULE_LAUNCH_COMPILEccache)set_property(GLOBALPROPERTYRULE_LAUNCH_LINKccache)endi......
  • C/C++《数据结构课程设计》题目[2023-07-01]
    C/C++《数据结构课程设计》题目[2023-07-01]《数据结构课程设计》题目一、【大数四则运算】——线性表[习题描述]设计—个实现任意长的整数进行四则运算和幂次运算的演示程序。[基本要求]利用双向循环链表实现大数的存储,每个结点含一个整型变量。[实现提示]实现原理:任何一......
  • C++ 编程中的核心知识点
    const作用修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointertoconst)和自身是常量的指针(常量指针,constpointer);修饰引用,指向常量的引用(referencetoconst),用于形参类型,即避免了拷贝,又避免了函数对值的修改;修饰成员函数,说明该成员函数内不能修改成员......
  • C++之future
    背景在C++多线程编程中,同步线程间的操作和结果通常是一个关键问题。C++11引入了std::future这一同步原语,用于表示异步操作的结果。本文将介绍C++中std::future的使用方法、优势以及与其他同步方法的对比。使用std::futurestd::future表示一个异步操作的结果,可以用于获取操作的......
  • 一天吃透Redis面试八股文
    内容摘自我的学习网站:topjavaer.cnRedis连环40问,绝对够全!Redis是什么?Redis(RemoteDictionaryServer)是一个使用C语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁......
  • Qt/C++编写超精美自定义控件(历时9年更新迭代/超202个控件/祖传原创)
    一、前言无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,越复杂功能越多的项目,自定义控件的数量就越多,最开始的时候可能每个自定义控件都针对特定的应用场景,甚至里面带了特定的场景的一些设置和处理,随着项目数量的增多,有些控件又专门提取出来共性,做成了通用的自定义......
  • 【零基础学习C++】如何写一个C++类?
    个人主页:【......