2025秋招Java还是c++?

一、我的编程经

说说我的编程经历,在C++和Java之间我经历了几个阶段:

  1. 大学期间,我浅尝辄止地学习了一段时间的Java,但后来放弃了,开始学习C/C++。
  2. 本科毕业后,我选择攻读硕士学位,并一直专注于C++的学习。
  3. 工作后,我一直从事C++开发工作,先是从事C++客户端开发,后来转向了C++服务器开发。

二、选择C++还是选择Java?

作为一位经验丰富的人,我想给出以下建议: 如果你是学生或者有大量空闲时间,我建议你将C++学好。C++被称为程序员的"九阳神功"并非毫无根据,这并不是因为C++有多难学,而是因为学习C++的技术栈涵盖了一系列操作系统原理。如果你能够掌握C++,就意味着你掌握了这些背后的原理。之后,学习其他任何语言和机制都会更轻松。

然而,如果你急需找工作,或者对编程并没有太大的兴趣,只是为了谋生,那么你可以优先选择Java,甚至可以只掌握Java的一些基本概念和常见的面试题。如果运气好的话,也有可能找到一份不错的工作。

三、如何学习C++?

学习C/C++这门语言与其他高级语言不同,它更靠近操作系统的底层。因此,为了学好C/C++技术栈,必须结合操作系统的运行机制进行学习。简单来说,你需要掌握几个基础知识:汇编语言、编译链接和运行时体系、操作系统原理、多线程编程以及网络编程。只有通过这样的学习,你才能真正理解、掌握并将所学应用于实践。我们学习C++不是为了纯粹的理论研究,而是要将所学投入实际生产中去。

下面是一张图来概括C++技术栈的内容:

3.1 学习C++语言的内容包括常用的C++11/14/17语法。

在C++的面试中,通常会问到以下几个与语法相关的问题,这些问题也是C++开发所必备的知识:

  • 在具有继承关系的父子类中,构造和析构子类对象时,父子构造函数和析构函数的执行顺序是怎样的?
  • 在具有继承关系的类体系中,父类的构造函数和析构函数一定要声明为虚函数吗?如果不声明为虚函数会有什么影响?
  • 什么是C++多态?C++多态的实现原理是什么?
  • 什么是虚函数?虚函数的实现原理是什么?
  • 什么是虚表?虚表的内存结构布局是怎样的?虚表的第一项(或第二项)是什么?
  • 在菱形继承(类D同时继承类B和类C,而B和C又继承自类A)体系下,虚表在各个类中的布局是怎样的?如果类B和类C同时拥有一个成员变量m,m在D对象的内存地址上的分布情况如何?是否会相互覆盖? 以上是与C++语法相关的问题,深入理解这些知识点将有助于学好C++语言。尽量通过阅读相关资料和教材来更详细地了解这些概念和原理。
  • 统一的类成员初始化语法与 std::initializer_list<T>
  • 注解标签(attributes)
  • final/override/=default/=delete 语法
  • auto 关键字
  • Range-based 循环语法
  • 结构化绑定stl
  • 容器新增的实用方法
  • std::thread
  • 线程局部存储
  • thread_local
  • 线程同步原语 std::mutex、std::condition_variable 等
  • 原子操作类
  • 智能指针
  • std::bind/std::function

3.2 提升C++水平

一旦你掌握了C++语言本身,你可以进一步学习一些常见的C++惯用法和高性能编码实践。具体来说,可以深入学习临时对象的使用、内存管理技巧、继承的最佳实践、虚函数的运用、内联函数的优化、引用计数等与提升C++效率相关的细节内容。此外,还可以学习STL(标准模板库)的使用,它是C++中非常强大和常用的工具库。通过学习这些内容,可以进一步提升你的C++编程水平,使你能够编写高效、可靠的C++代码。

3.3 C++ 工程实践

在掌握了 C++ 常用语法和语言背后的实现机制和常用惯用法后,如何在实际开发中如何设计 C++ API 接口,大型 C++ 程序小到单个 .h/cpp 文件如何编写,大到大型 C++ 项目如何组织,这些知识点你需要了解。

3.4 与C/C++相关的必备知识 - 汇编

了解汇编是与C/C++相关的基础知识之一。学习汇编并不意味着一定要用汇编来编写代码,就像学习C/C++并不仅仅是为了面试和找工作一样。

对于C/C++的学习者来说,掌握汇编是强烈建议的,因为只有这样,你才能清楚地了解每一行C++代码背后所对应的机器指令,了解基本的程序结构如if/for/while是如何实现的,了解函数的返回值是如何返回的,以及为什么整型变量的数学运算不是原子操作。

通过掌握汇编,你可以明确地知道在C++中,栈对象从构造到析构的整个生命周期中,开发者的代码、编译器和操作系统各自承担了哪些任务。掌握汇编后,你可以理解函数调用的实现原理,了解不同的函数调用方式,以及为什么像printf这样的函数必须采用__cdecl的方式而不能是__stdcall。此外,通过掌握汇编,你还可以理解为什么添加一个类的成员函数不会增加其实际占用的内存空间。掌握了汇编,你将能够更加高效地编写C++代码。

第二个基础知识 - 编译、链接与运行时体系

作为开发者,了解编译、链接和运行时体系知识是非常重要的。我们需要清楚地了解我们编写的C/C++程序是如何经过预处理、编译和链接等步骤最终转变为可执行的二进制文件的。还需要了解操作系统如何识别一个文件为可执行文件,以及可执行文件包含哪些内容。在程序执行时,需要知道如何加载到进程的地址空间中,以及程序的每个变量和数据在进程地址空间的哪个位置,并且如何引用它们。此外,还需要了解一个进程的地址空间包含哪些内容,各个地址段分布了什么内容,以及为什么读写空指针或野指针会出现问题。对于编译、链接和运行时体系的了解,有助于我们更好地理解代码的执行过程和内存管理,以避免潜在的错误和优化程序性能。

第三个基础知识 - 狭义的操作系统原理

狭义的操作系统原理是指操作系统在特定范畴内的原理和机制。在广义的操作系统原理中,我们已经涵盖了之前提到的内容。而狭义的操作系统原理则包括操作系统如何管理进程和线程,以及虚拟内存与物理内存之间的对应关系。此外,还包括了内存映射文件的概念和实现方式,以及进程之间的通信机制等等。了解狭义的操作系统原理可以帮助我们深入理解操作系统的内部工作原理,从而更好地进行程序开发和系统优化。

第四个基础知识-多线程

尽管多线程知识在第三点中已经提到了,但我单独列出来是因为多线程编程是应用服务中常用的技术之一。最近我面试了几个学历非常好的同学,发现他们对于一个进程中如果某个线程因为内存问题退出是否会导致整个进程退出的问题,回答得不理想。这是不应该的。其实,多线程知识并不难学习,只要真正理解并实践,而非为了应付面试,就能学得很好。无论是Windows还是Linux操作系统,提供的线程同步对象都有几种基本类型。在Windows中,常见的有临界区(关键区)、事件、互斥体、信号量等;而在Linux中,有互斥体、信号量、读写锁、条件变量等。这些知识点只要花几天时间就能弄清楚。

大多数同学之所以不会,不是因为学不会,而是不愿意学。然而,他们却喜欢在简历上写熟悉多线程编程。面试时,如果被问到条件变量的虚假唤醒机制,他们却说不清楚,却非要说自己用过条件变量。这是一些同学犯的低级错误。如果真的用过条件变量,却不了解虚假唤醒机制,那么他们编写的代码一定是有问题的。

掌握了常见的多线程同步原语后,接下来可以找一些包含多线程的项目来学习,无论是否带有UI。我推荐一种方式,使用gdb或者Visual Studio调试器,将你想要学习的多线程程序进行断点调试,在多线程面板中查看该进程中有多少个正在运行的线程,分析每个线程的作用,然后研究这些线程是何时何地创建的,以及为什么需要创建新的线程。尝试过几个多线程项目后,你将对多线程编程变得更熟练。

第五个基础知识-网络编程

简单地说就是 Socket 编程。操作系统提供的网络编程接口在相当长的时间内保持不变,一旦掌握,将受益终生。理解和掌握基本的 Socket API 不仅可以自定义各种网络通信框架,还可以轻松使用市面上流行的网络通信库。更重要的是,它将成为你解决各种网络问题的坚实技术支持。虽然像 Java、Go、Python 等语言对网络编程进行了封装,但作为技术的源头,我们有什么理由不去掌握它呢?

总而言之,学习 C++ 不仅仅是学习语法本身,还需要熟悉与 C++ 技术栈相关的操作系统原理。

最后,老舅整理一个完整的学习路线,适用于从零开始学习 C/C++ Linux 后端服务器开发(参考腾讯 T8 技术栈)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/632155.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【错题集-编程题】空调遥控(二分 / 滑动窗口)

牛客对应题目链接&#xff1a;空调遥控 (nowcoder.com) 一、分析题目 1、滑动窗口 先排序&#xff0c;然后维护窗口内最大值与最小值的差在 2 * p 之间&#xff08;max - min&#xff09;。 2、二分查找 先排序&#xff0c;然后枚举所有的温度&#xff0c;⼆分出符合要求的…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

python开发的学习路线

I. 基础知识学习 A. Python基础语法 变量和数据类型 学习如何定义变量&#xff0c;理解并使用不同的数据类型&#xff08;整数、浮点数、字符串、布尔值等&#xff09;。 掌握数字类型的转换和操作。 熟悉字符串的基本操作&#xff0c;如拼接、切片、替换和查找。 …

JVM内存模型最新面试题(持续更新)

问题&#xff1a;java中创建的对象一般放在哪里&#xff1f;(全流程包含从创建到回收) 回答 大部分对象在堆中&#xff0c;这个基本都知道&#xff1b; 少部分对象是会在栈中的&#xff0c;比如作用域不局限于方法内的方法内部变量&#xff0c;这类对象的特征一般就是生命周期…

JavaScript对象设计哲学:八种模式塑造高效代码

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言 &#x1f680;二、Object 构造函数 &#x1f9f1;&#x1f4cc; 基本用法&#x1f4cc; 重要性&#x1f4cc; 实际应用案例 三、对象字面量 &#x1f4d8;&#x1f4cc; 定义属性&#x1f4cc; 定义方法&#x1f4…

2.2、Gitea忘记密码重置密码

忘记密码后&#xff0c;管理员可以使用gitea的主程序输入命令重置密码。 gitea admin user change-password --username myname --password asecurepassword

工业派-配置Intel神经计算棒二代(NCS2)

最近两天在工业派ubuntu16.04上配置了Intel神经计算棒二代——Intel Neural Compute Stick&#xff0c;配置过程之艰辛我都不想说了&#xff0c;实在是太折磨人。不过历尽千辛万苦&#xff0c;总算让计算棒可以在工业派ubuntu16.04系统上跑了&#xff0c;还是蛮欣慰的。 注&…

数据分析案例-印度美食数据可视化分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

alphassl泛域名证书13个月600

AlphaSSL是GlobalSign旗下的数字证书品牌&#xff0c;它主要视为客户提供两种入门级的SSL证书——DV单域名以及泛域名SSL证书。这两种SSL证书一种可以保护www和两个域名记录&#xff0c;或者单个子域名激励&#xff1b;另一种可以同时保护多个域名记录&#xff0c;满足了大部分…

Django视图Views

Views视图 HttpRequest 和HttpResponse Django中的视图主要用来接受web请求&#xff0c;并做出响应。视图的本质就是一个Python中的函数视图的响应分为两大类 1)以Json数据形式返回(JsonResponse) 2)以网页的形式返回 2.1)重定向到另一个网页 (HttpRe…

计算机组成原理(超详解!!) 第九节 外围设备

1.外围设备概述 1.外围设备的一般功能 外围设备的定义&#xff1a;这个术语涉及到相当广泛的计算机部件。除了CPU和主存外&#xff0c;计算 机系统的每一部分都可作为一个外围设备来看待。 外围设备的功能&#xff1a;在计算机和其他机器之间&#xff0c;以及计算机与用户之…

C#知识|(实例)大乐透双色球随机选号器项目实现(一)

哈喽,你好啊,我是雷工! 本节学习练习大乐透双色球随机选号器项目的实现,以下为学习笔记。 01 功能需求 当点击【启动】按钮时,号码开始随机变化; 当点击【选择】按钮时,号码停止随机变化,并将选定的号码显示到下方列表; 当点击【清除】按钮时,下方显示列表被清空。…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…

Microsoft Remote Desktop Beta v10.9.7 Mac微软远程连接工具

Microsoft Remote Desktop Beta 是一种软件应用程序&#xff0c;使用户能够从其设备远程访问基于 Windows 的计算机或虚拟机。它可以在 Windows 和 Mac 操作系统上下载。通过 Microsoft Remote Desktop&#xff0c;用户可以使用远程桌面协议 (RDP) 或 RemoteFX 协议连接到远程桌…

【qt】日历和定时器

日历和定时器 一.Calendar Widget(日历组件)1.日历的基本使用 二.定时器1.定时器的用处2.创建一个定时器3.设置定时器时间间隔4.设置定时器类型5.超时信号6.关联定时器7.启动定时器8.关闭定时器9.定时器要执行功能 三.总结一下&#xff1a; 一.Calendar Widget(日历组件) 1.日…

亚马逊调整退货处理费,卖家如何应对新挑战?

在电子商务领域&#xff0c;退货处理一直是一个重要且复杂的问题。作为全球最大的电子商务平台之一&#xff0c;亚马逊一直在寻求优化退货处理流程&#xff0c;以平衡消费者满意度和运营成本。近日&#xff0c;亚马逊宣布自2024年6月1日起&#xff0c;将对退货处理费收取标准进…

ATFNet:长时间序列预测的自适应时频集成网络

ATFNet是一个深度学习模型&#xff0c;它结合了时间域和频域模块来捕获时间序列数据中的依赖关系。引入了一种新的加权机制来调整周期性的权重&#xff0c;增强了离散傅立叶变换&#xff0c;并包括一个复杂关系识别的注意力机制&#xff0c;在长期时间序列预测中优于当前方法(每…

一休:一款专业的休息提醒软件

对于长期使用电子产品的人来说&#xff0c;保护眼睛至关重要&#xff0c;不论是工作还是学习&#xff0c;适当的休息都是必要的&#xff0c;保护视力要牢记20-20-20法则&#xff0c;眼科医生陶勇也科普过&#xff1a; 使用电脑工作和学习时&#xff0c;容易会忘记时间&#x…

Maven 依赖排查

先从项目去看显而易见&#xff0c;假如我们有一个项目&#xff0c;父工程中包含一些子工程&#xff0c;如下&#xff1a; 我们想看一下samples-account中的依赖关系&#xff0c;那么我们可以打开 samples-account的pom文件&#xff0c;查看其maven依赖关系图。 我们可以看到此项…

WPS如何把多个表格合并到一个表格里面?

注意&#xff1a;此功能需要wps会员。 例如&#xff1a;这里有3个表格。 现在希望合并3个表格到一起&#xff0c;如下图所示。 新建一个表格&#xff0c;打开表格。 选择 开始->工作表->合并表格->整合成为一个工作薄。 弹出对话框&#xff0c;选择添加文件&#xff…