C++面试八股文:技术勘误
在《C++面试八股文:C++中,设计一个类要注意哪些东西?》https://www.cnblogs.com/bujidao1128/p/17481540.html一文中,
#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是如何实现的?》https://www.cnblogs.com/bujidao1128/p/17501900.html一文中,
有std::string重载的相关问题,参考大佬的文章https://zhuanlan.zhihu.com/p/639025532 文中做了详细的说明。
在《C++面试八股文:override和finial关键字有什么作用?》https://www.cnblogs.com/bujidao1128/p/17515504.html一文中,final
误拼为 finial
。
同时,这张内存布局图也有错误,
应该是这样的:
在《C++面试八股文:std::vector了解吗?》https://www.cnblogs.com/bujidao1128/p/17518035.html一文中,
面试官:
push_back
和emplace_back
有什么区别?
除了文中所说的不同点,还要一点:emplace_back
可以传入构造函数构造对象,而push_back
只能拷贝或移动对象。
在《C++面试八股文:std::vector和std::list,如何选择?》https://www.cnblogs.com/bujidao1128/p/17520119.html一文中,
以下代码的输出是什么?
#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++面试八股文:什么是构造函数?》https://www.cnblogs.com/bujidao1128/p/17552505.html一文中,
面试官:可以使用
virtual
修饰构造函数吗?
二师兄:不可以,因为构造函数在对象构造阶段调用,虚表尚未建立,所以无法调用虚函数实现多态。
这里的描述是有问题的,虚表是在编译期生成,在构造函数执行时,可能还没有被初始化。所以无法调用虚函数实现多态。
在《C++面试八股文:什么是空指针/野指针/悬垂指针?》https://www.cnblogs.com/bujidao1128/p/17586434.html一文中,
面试官:你知道
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
。