乐趣区

关于c++: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;
}

这里的例子 f1f2办法的参数应该是 Foo fconst Foo f,这才是顶层const。在此感激知乎用户 退乎 的揭示。

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

有 std::string 重载的相干问题,我曾经在 技术勘误:《C++ 面试八股文:std::string 是如何实现的?》一文中做了具体阐明,在此再次感激知乎用户 肃穆 的斧正。

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

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

应该是这样的:

感激知乎用户 清越 的斧正。

在《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++!(狗头)

退出移动版