感觉 C++ 很简单,但为何这么多劝退的?

本文深入探讨了C++学习的挑战,从基础语法到面试常见问题,涵盖C++语言、操作系统原理、网络编程、项目开发所需知识。通过实例分析电驴和Redis的开发,揭示了C++开发所需的技能和知识点,强调了学习过程中对C语言、操作系统API、多线程、数据库和网络通信的理解。文章提供了学习路径和资源,帮助读者系统地提升C++能力。
摘要由CSDN通过智能技术生成

先用看两个 C++ 程序做个热身

10 天整理完语法?来请题主先看看下面 C++ 程序中语法错误如何解决?

#include <memory>

class A {

};

void f1(std::unique_ptr<A>&& a1) {
    
}

void f2(std::unique_ptr<A>&& a2) {
    //这里编译有错误,如何修改?
    f1(a2);
}

int main()
{
    std::unique_ptr<A> spA(new A());
    //这里编译有错误,如何修改?
    f2(spA);

    return 0;
}

再来看一个问题,以下程序为何会崩溃:

#include <iostream>
#include <map>
#include <memory>

class A {
public:
    A() {

    }

    ~A() {

    }
};

class B {
public:
    B(A* pA) : m_spA(pA) {

    }

    ~B() {

    }

private:
    std::unique_ptr<A>  m_spA;
};


int main()
{
    {
        std::map<int, std::shared_ptr<B>> mymap;
    
        auto pA = std::make_unique<A>();
        auto pB = std::make_shared<B>(pA.get());

        mymap.emplace(1, pB);
    }

    std::cout << "hello world." << std::endl;

    return 0;
}

校招 C++ 要求

我们再来看下企业是对 C++ 校招生是如何要求的。

C++ 是一门很注重语言和接口背后原理的编程语言,下面分享的关于 C++ 的内容都是比较常用的(不存在为了考察而考察),也就是说这些知识在实际 C++ 编码中都会用到。

C++ 语言篇

考察 C++,不仅仅指 C++,也可能包含部分 C 语言的内容。

  • 请说出 const char *p 、 char const *p 与 char * const p的区别,这个问题答错,面试基本不会通过,说明基本功差
  • static_cast、dynamic_cast、reinterpret_cast 和 const_cast 几种 C++ 类型转换符的区别偶尔也会问到,面试者至少要知道第一种。
  • 看下面代码,计算各个值(这个问题答错,面试基本不会通过,说明基本功差):
// 32位系统上
struct A {
    int  i;
    char j;
};

A a;
A* pa = &a;

sizeof(a) = ?
sizeof(pa) = ?

int arr[8];
int* parr = arr;

sizeof(arr) = ?
sizeof(arr[0]) = ?
sizeof(parr) = ?

char sz[] = "helloworld";
char* psz = sz;

sizeof("helloworld") = ?
sizeof(sz) = ?
sizeof(psz) = ?
  • 关于 C++ 面向对象,问得最多的问题是 C++ 的多态,一般会问多态的概念和多态在 C++ 语言中的实现,如果面试者说出了多态用途并引出了类的虚表,接下来面试官可能会追问虚表的结构。一个常见的问题是“菱形继承”中虚表的个数,即类 A 有子类 B 和 C,类 D 继承 B 和 C,那类 D 有几个虚表呢?

  • 有些面试官会以面向对象的三大特性开始提问,面试者回答出来“封装”、“继承”和“多态”后,注意了,接下来面试官可能要开始考察“继承”和“多态”(多态上文介绍了,不再重复)。常见的继承问题有,我们知道 C++ 的类继承分为 public、protected、private 三类继承方式,面试官会询问如果类 B 有一个 public/protected/private 的方法 f,现在类 A 以 public/protected/private 方式继承,那么在 B 中方法 f 是何种访问权限。此类问题答错,面试基本不会通过。
  • 考察继承的时候也会问一些父子类的构造和析构顺序或者子类析构函数为何要用 virtual 关键字声明的简单问题。这类问题不问则罢,如果被问到,答错,面试必挂。
  • 继承问题中还有常常会问重载(override)和重写(overwrite)的区别。关于重载有两个常见的问题,第一个:一个类方法名和参数数量、类型和顺序都是一样的,但是返回值类型不一样,是否构成重载?这个问题比较简单;第二个问题,一个方法加了 const 和不加 const 是否构成重载?答案是构成重载的,如果读者想不通,可以看下面两个表达式:
a[1] = 1;
b = a[1];

如果 a 是一个类的实例,前者调用 a 类的 int operator[](int i) 方法,后者调用 a 类的 int operator[](int i) const 方法。你答对了吗?

  • C++ 也会对常见的 stl 容器进行考察,例如一般问你是否用过 std::map、std::set 等数据结构,如果你说没用过,那面试到此就基本结束了(面试不通过);如果你说用过,接下来会问你这些容器背后的数据结构、插入删除的算法复杂度(最好和最坏的情况)、以及各个容器的使用场景和注意事项。有的面试官还会问,std::vector 的 resize 和 reserve 方法的区别。
  • 如果岗位要求会使用 C++11 或者面试者的简历中提到 C++11 等 Modern C++ 的内容,面试官会问一些 C++11 的内容,通常会问你用过或者熟悉哪些 C++11 的特性,我看部分同学只能简单地说出 auto 关键字等少量语法特性,这样显然是不行的。C++11 问得最多的是几种常用的智能指针,即 std::unique_ptr、std::shared_ptr、std::weak_ptr,面试者需要熟悉这几种智能指针的使用场景和区别,以及智能指针背后的实现原理(引用计数),智能指针还会结合多线程场景来问,例如智能指针是否是线程安全的(引用计数是线程安全的,管理的内容不是),关于 C++11 的智能指针的使用,我写过一篇详细的文章 《Modern C++智能指针详解》。左值、右值、左值引用、右值引用、std::move、std::emplace 和移动构造函数的内容也是 C++11 面试常问的问题。     Modern C++智能指针详解
  • 如果面试的岗位对底层要求有一定的了解,会结合 C 语言考察一些内容,例如函数的调用方式。面试官可能不会一上来就直接告诉你他在考察函数调用的知识点,他可能会结合一些案例来问,例如,假设让你实现 C 语言中的 printf 函数,需要注意哪些事项?一般有两点,第一点支持不定项参数,这个如果看过相关源码的同学,可能知道使用 va_ 系列的宏就可以了,另外一点是这种支持不定参数的函数的调用方式必须是 C 调用(__cdecl),不能是标准调用(__stdcall),因为 C 调用由调用者来平衡堆栈,标准调用由被调用者来平衡堆栈,对于支持不定参数的函数,只有实际被调用时,才
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值