C++面试八股文:技术勘误
不知不觉,《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;
}
这里的例子f1
和f2
方法的参数应该是Foo f
和const Foo f
,这才是顶层const
。在此感谢知乎用户 退乎 的提醒。
在《C++面试八股文:std::string是如何实现的?》一文中,
有std::string重载的相关问题,我已经在 技术勘误:《C++面试八股文:std::string是如何实现的?》 一文中做了详细说明,在此再次感谢知乎用户 庄严 的指正。
在《C++面试八股文:override和finial关键字有什么作用?》一文中,final 误拼为 finial,感谢知乎用户 DiaoYan 的指正。
同时,这张内存布局图也有错误,
应该是这样的:
感谢知乎用户 清越 的指正。
在《C++面试八股文:std::vector了解吗?》一文中,
面试官:
push_back
和emplace_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
三者之间的区别吗?二师兄:虽然三者都能定义空指针,但三者类型不同。
二师兄:
0
是int
类型,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++!(狗头)
C++面试八股文:技术勘误的更多相关文章
- 《面试八股文》之kafka21卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- 蚂蚁社招Java-第四轮电话面试【技术终面】
作者:听着歌过面试链接:https://www.nowcoder.com/discuss/64708来源:牛客网 蚂蚁社招Java-第四轮电话面试[技术终面] 转载 (耗时22分钟,其实聊得东西挺 ...
- Mysql面试的技术名词
面试的技术名词 面试一般会遇到一些名词,其实可能自己都知道其中的道理,但是因为没了解过,当时心里就一句WC,然后弱弱答一句:不好意思这个我只是听过,具体还没了解过: 回表 覆盖索引 最左前缀匹配 索引 ...
- 一天吃透JVM面试八股文
什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...
- 这可能是最全面的Redis面试八股文了
Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...
- 常见的面试C#技术题目
遍历查询窗体界面的textbox为空值 ? foreach (System.Windows.Forms.Control control in this.Controls) { ...
- 三天吃透Spring面试八股文(最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- 三天吃透Java虚拟机面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
随机推荐
- idea的上git的拉取推送
下载好idea和git idea的下载破解查看https://www.cnblogs.com/badfisher/p/14709120.html git官网要求下载即可. 获取仓库路径点击复制. 在i ...
- pandas之reindex重置索引
重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行.列标签与 DataFrame 中的数据逐一匹配.通过重置索引操作,您可以完成对现有数据的重新排序.如果重置的 ...
- ajax面试题总结
转载请注明出处: 1.ajax异步和同步的区别 Ajax是一种基于JavaScript语言和XMLHttpRequest对象的异步数据传输技术,通过它可以使不用刷新整个页面的情况下,对页面进行部分更新 ...
- Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解
前言 qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的. 其中就包括华丽绚烂的三维图表,数据量不大的时候是可 ...
- 使用ServiceSelf解决.NET应用程序做服务的难题
1 ServiceSelf 为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台. 功能 自我服务安装 自我服务卸载 自我服务日志监听 2 自我服务安装 虽然. ...
- GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
环顾四周,皆是对手! 云时代的掉队者,由于Java启动的高延时.对资源的高占用.导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算.IoT方向上也是难觅踪影; Java语言在业 ...
- docker启动mysql注意事项
1.编码问题 登录mysql伪终端 mysql查看编码 show variables like 'character%'; 宿主机在conf.d中添加配置my.cnf文件 [client] defau ...
- 搭建SpringCloudAlibaba父工程
1.首先创建一个maven项目 删除src目录,当做一级目录用来管理第三方jar版本控制. 2.配置pom文件. SpringCloud.SpringCloudAlibaba.SpringBoot版本 ...
- vue2.x/vue3.0中使用ts
vue2.x(vue-cli3)中使用ts https://www.jianshu.com/p/3cbcdd766295 https://www.cnblogs.com/xiaohuizha ...
- 分享一个提高运维效率的 Python 脚本
哈喽大家好我是咸鱼,今天给大家分享一个能够提升运维效率的 python 脚本 咸鱼平常在工作当中通常会接触到下面类似的场景: 容灾切换的时候批量对机器上的配置文件内容进行修改替换 对机器批量替换某个文 ...