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 技术栈)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团小程序mtgsig1.2逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

汇编--栈和寄存器

栈 栈是一种运算受限的线性表&#xff0c;其限定仅在表尾进行插入和删除操作的线性表&#xff0c;表尾也被叫做栈顶。简单概括就是我们对于元素的操作只能够在栈顶进行&#xff0c;也造就了其先进后出的结构特性。 栈 这种内存空间其实本质上有两种操作&#xff1a;将数据放入…

C语言如何删除表中指定位置的结点?

一、问题 如何删除链表中指定位置的结点&#xff1f; 二、解答 删除链表中指定的结点&#xff0c;就像是排好队的⼩朋友⼿牵着⼿&#xff0c;将其中⼀个⼩朋友从队伍中分出来&#xff0c;只需将这个⼩朋友的双⼿从两边松开。 删除结点有两种情况&#xff1a; &#xff08;1&am…

CRM与SCRM:联系与区别

引言 在当今数字化时代&#xff0c;企业与客户之间的互动变得日益频繁而复杂。为了更好地管理客户关系并提供更个性化的服务&#xff0c;许多企业采用了客户关系管理&#xff08;CRM&#xff09;系统。与此同时&#xff0c;随着社交媒体的普及和社交化互动的增加&#xff0c;社…

【文末附gpt升级方案】探讨当前时机是否适合进入AIGC行业(一)

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;作为新兴的技术领域&#xff0c;正逐步走进公众的视野&#xff0c;并在多个行业展现出巨大的应用潜力。然而&#xff0c;对于创业者、投资者以及希望进入这一领域的专业人士来说&#xff0c;当前时…

传输层协议——TCP协议

目录 一、TCP协议 二、TCP协议格式 三、序号和确认序号 四、窗口大小 五、六个标记位 六、三次握手和四次挥手 七、滑动窗口 八、拥塞控制 九、延迟应答和捎带应答 1、延迟应答 2、捎带应答 十、面向字节流 十一、粘包问题 十二、TCP异常情况 十三、再谈listen函…

小程序|锁定查询功能如何使用?

学生或家长想要实现自己查询完成后&#xff0c;任何人都无法再次查询&#xff0c;老师应该如何设置&#xff1f;易查分的【锁定查询功能】就可实现&#xff0c;下面教大家如何使用吧。 &#x1f4cc;使用教程 &#x1f512;锁定查询功能介绍 ✅学生或家长自主锁定&#xff1a;开…

实现mysql的主从复制、实现MySQL的读写分离与负载均衡

实验环境 &#xff08;注明&#xff09;以下的所有关于yum和rpm以及tar的软件需要自己准备&#xff0c;没有的话可以私信博主 实验目标&#xff1a; 1.实现mysql主从复制 2.实现mysql读写分离与负载均衡 实验一、搭建mysql主从复制 1.建立时间同步环境&#xff0c;在主节…

Linux-笔记 开发板Uboot命令使用

将之前自学的知识整理了一下笔记&#xff0c;以便回忆 信息查询命令 1、help/?&#xff1a;查看所支持命令 > ? md md - memory displayUsage: md [.b, .w, .l] address [# of objects]2、bdinfo&#xff1a;查询板子信息 > bdinfo arch_number 0x00000000 boot_p…

C#知识|上位机子窗体嵌入主窗体方法(实例)

哈喽,你好啊,我是雷工! 上位机开发中,经常会需要将子窗体嵌入到主窗体, 本节练习C#中在主窗体的某个容器中打开子窗体的方法。 01 需求说明 本节练习将【账号管理】子窗体在主窗体的panelMain容器中打开。 账号管理子窗体如下: 主窗体的panelMain容器位置如图: 02 实现…

四川古力未来科技抖音小店:科技赋能,购物新体验!

在当下这个数字化飞速发展的时代&#xff0c;电商行业早已成为了人们日常生活中不可或缺的一部分。而抖音小店作为电商领域的一匹黑马&#xff0c;正以其独特的优势和魅力&#xff0c;吸引着越来越多的消费者。今天&#xff0c;我们就来一起探讨一下四川古力未来科技抖音小店的…

免费视频格式在线转换网站,推荐这5款!

在数字化时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着各种设备和平台的不断涌现&#xff0c;视频格式繁多&#xff0c;常常会出现不兼容的情况。为了解决这一问题&#xff0c;视频格式在线转换网站应运而生&#xff0c;成为了我们应…

微软宣布GPT-4o模型,可在 Azure OpenAI上使用

5月14日&#xff0c;微软在官网宣布&#xff0c;OpenAI最新发布的多模态模型GPT-4o&#xff0c;可以在 Azure OpenAI 云服务中使用。 据悉&#xff0c;GPT-4o支持跨文本、视频、音频多模态推理&#xff0c;例如&#xff0c;通过GPT-4o打造一个AI助手&#xff0c;用于辅导孩子解…

【Python】语句与众所周知【自我维护版】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客是在之前的基础上进行的维护 目录 条…

Kibana使用

一、什么是Kibana   Kibana 是一个开源的分析和可视化平台&#xff0c;Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析&#xff0c;并在各种图表、表格和地图中可视化数据。 Kibana使用&#xff1a…

前端学习第一课

AJAX 事先说明&#xff0c;这只是记录&#xff0c;并不是从零到一的教学内容&#xff0c;如果想要学习的话&#xff0c;可以跳过本文章了 ok&#xff0c;转回正题&#xff0c;正如上面所说&#xff0c;这只是记录。其实我是有一定的前端基础的&#xff0c;也做过涉及相关的开发…

力扣82题删除排序链表中的重复元素

82题删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 题目分析 这个题需要返回已排序链表&#xff0c;我们需要考虑一种情况就是头结点为重复元素&…

学习C语言的重要性以及如何学好

配套视频&#xff1a;https://www.bilibili.com/video/BV1kw4m1Q7AV/?spm_id_from333.999.0.0 一、C语言在互联网领域重要的开源项目 https://github.com/mysql/mysql-server 数据库开源项目【互联网重型开源项目】 编程语言&#xff1a;C/C/ASM 部分汇编代码 开源项目核心…

【汇编】算术指令

一、加法指令 &#xff08;一&#xff09;各加法指令的格式及操作 加法指令可做字或字节运算 &#xff08;1&#xff09;加法指令 ADD 格式&#xff1a;ADD DST,SRC执行的操作&#xff1a;(DST) ← (SRC)(DST) &#xff08;2&#xff09;带进位加法指令 ADC 格式&#xf…

除自身以外数组的乘积[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个整数数组nums&#xff0c;返回数组answer&#xff0c;其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法&#xff…