如何成为C++大神?五个技巧助你提升编程水平

news2024/12/23 22:22:33

一名优秀的C++程序员是如何炼成的?这个问题一直困扰着许多人,尤其是那些刚刚踏入编程的世界的新手。C++作为一门强大而复杂的编程语言,的确需要一些特殊的技巧和策略才能掌握。但幸运的是,成为一名出色的C++程序员并不是不可能的任务。在这篇文章中,小狮妹将深入探讨如何塑造自己,成为C++领域的翘楚。

01 寻找可信赖的资源

学习C++的第一步是找到可信赖的学习资源。因为C++是一门历史悠久的语言,所以网上有很多关于C++的书籍、文章、视频和课程,但并不是所有的资源都是高质量的。有些资源可能已经过时了,有些资源可能包含错误或误导性的信息,有些资源可能只是为了吸引眼球而不顾事实。因此,你需要从权威渠道获取信息,避免浪费时间和精力。

对于C++视频课程,我推荐你看看零声教育的课程,课程内容丰富(完整学习路线放在了结尾),绝对满足你工作和面试所需,以下是部分试听内容

c/c++程序员进个大厂很难吗?来看看这套腾讯T9认证的C++后端开发技术(数据结构、网络编程、网络原理、中间件、开源框架、云原生、分布式)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1cP4y1k7xt/

此外,当你遇到特定问题时,优先使用Google进行搜索,查找StackOverflow上的高质量问题和回答。StackOverflow是一个专业的编程问答社区,你可以在那里找到很多有经验的C++程序员的解答和建议。当然,你也可以自己提问,但要注意遵守社区规则和礼仪。

02 警觉未定义行为

未定义行为(Undefined Behavior,UB)是C++编程中最容易出错和最难发现的问题之一。UB指的是那些语言标准没有规定其行为或结果的操作或表达式。UB可能导致代码在不同情境下产生不可预测或不一致的结果,甚至可能导致程序崩溃或数据损坏。因此,一名卓越的C++程序员需要对UB保持高度警觉,并尽量避免UB。

常见的UB包括以下几种:

  • 访问未初始化的变量:如果你使用一个没有被初始化过的变量,那么它可能包含任意值或垃圾值,这会影响后续计算或判断。

  • 有符号整数溢出:如果你对一个有符号整数进行加减乘除等运算,并且结果超出了该类型能表示的范围,那么结果就是UB。例如int x = INT_MAX + 1;就会产生UB。

  • 除零操作:如果你对一个整数或浮点数进行除法或取余运算,并且除数为零,那么结果就是UB。例如int x = 10 / 0;就会产生UB。

  • 修改const常量或字面量:如果你试图修改一个被const修饰的变量或一个字面量(如字符串字面量),那么结果就是UB。例如const int x = 10; x = 20;就会产生UB。

  • 未锁保护的非原子变量用于并发操作:如果你在多个线程中对同一个非原子变量进行读写操作,并且没有使用锁或其他同步机制,那么结果就是UB。例如int x = 0; std::thread t1(&{x++;}); std::thread t2(&{x++;}); t1.join(); t2.join();就会产生UB。

要了解并避免UB,你需要不断学习和积累经验。你可以阅读C++标准或相关书籍,了解UB的定义和分类。你也可以使用一些工具来检测UB,例如编译器的警告选项、静态分析工具、动态分析工具等。在代码审查中,你也应该查找并指出潜在的UB,以确保代码的可靠性和稳定性。

03 实践防御性编程

防御性编程是一种编程风格,它强调在编写代码时考虑所有可能出错的情况,并提前做好应对措施,以避免程序出现意外的行为或结果。防御性编程可以提高代码的健壮性和安全性,减少bug和漏洞的发生。一名卓越的C++程序员应该实践防御性编程,以保证代码的质量。

在C++中,实践防御性编程的一个重要方法是使用资源获取即初始化(RAII)模式。RAII模式是一种管理资源(如内存、文件、锁等)的技巧,它将资源的分配和释放与对象的构造和析构绑定在一起。这样,当对象创建时,它就自动获取资源;当对象销毁时,它就自动释放资源。这样可以避免资源泄漏、重复释放、无效引用等问题。

另一个实践防御性编程的方法是处理异常和错误。在C++中,异常是一种表示程序运行过程中出现了非正常情况的机制,它可以通过throw关键字抛出,并通过try-catch语句捕获和处理。错误是一种表示程序运行过程中出现了无法恢复的情况的机制,它可以通过返回错误码或设置全局变量来表示,并通过检查返回值或全局变量来处理。

无论是异常还是错误,你都应该显式地处理每个可能失败的调用,并提前考虑可能引发异常或错误的情况,以避免意外的程序流程。

04 设计对象生命周期

对象生命周期指的是对象从创建到销毁的过程,它涉及到对象的构造、初始化、赋值、移动、复制、销毁等操作。理解和合理设计对象的生命周期是卓越C++程序员的关键特质,它可以影响代码的效率、可读性和可维护性。

你可以借鉴Rust编程语言的所有权概念,将其应用于C++代码中。所有权概念指的是每个值都有一个唯一的所有者(owner),当所有者离开作用域时,值就会被销毁。这样可以避免内存泄漏和悬空指针等问题。在C++中,你可以使用std::unique_ptr<T>来表示一个独占所有权(exclusive ownership)的智能指针(smart pointer),它只能被移动(move),不能被复制(copy)。

你也可以使用std::move函数来将一个左值(lvalue)转换为一个右值(rvalue),从而实现移动语义(move semantics)。移动语义指的是将一个对象的资源从一个对象转移给另一个对象,而不是复制它的内容。这样可以提高代码的效率,避免不必要的内存分配和拷贝。

你也可以使用std::copy函数来实现复制语义(copy semantics)。复制语义指的是将一个对象的内容复制给另一个对象,而不是转移它的资源。这样可以保留原对象的状态,避免破坏它的不变性(invariant)。

在C++中,你可以使用std::shared_ptr<T>来表示一个共享所有权(shared ownership)的智能指针,它可以被复制和移动。但是,你应该避免过度使用复杂的共享所有权语义,因为它们会增加代码的复杂度,降低代码的可读性和可维护性。

05 不依赖实现,依赖标准

在C++编程中,你应该尽量不依赖特定的编译器或平台的实现细节,而应该依赖C++语言标准和规范。因为不同编译器或平台可能有不同的实现方式,特定实现可能包含一些未知的优化或黑魔法,可能导致代码在不同环境下产生不同的行为或结果。这会影响代码的可移植性和稳定性,甚至可能导致UB或安全漏洞。

因此,你应该遵循C++语言标准和规范,而不是特定的实现细节。你可以阅读C++标准或相关书籍,了解C++语言的定义和要求。你也可以使用一些工具来检查代码是否符合标准和规范,例如编译器的标准选项、静态分析工具、代码格式化工具等。在代码审查中,你也应该查找并指出与标准和规范不一致的地方,以确保代码的质量和一致性。

成为一名C++大神并不是一件容易的事情,它需要你不断学习、不断挑战自己、养成良好的编程习惯、以及不断提升自己的技能。

以下是零声教育的学习路线图

Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)试听地址

1、精进基石专栏

(一)数据结构与算法

(二)设计模式

(三)c++新特性

(四)Linux工程管理

2、高性能网络设计专栏

(一)网络编程异步网络库zvnet

(二)网络原理

(三)自研框架:协程框架ntyco的实现(已开源)

(四)自研框架:基于dpdk的用户态协议栈的实现(已开源)

(五)高性能异步io机制io_uring

3、基础组件设计专栏

(一)池式组件

(二)高性能组件

(三)开源组件

4、中间件开发专栏

(一)Redis

(二)MySQL

(三)Kafka

(四)grpc

(五)Nginx

5、开源框架专栏

(一)游戏服务器开发skynet (录播答疑)

(二)分布式API网关

(三)SPDK助力MySQL数据落盘, 让性能腾飞(基础设施)

(四)高性能计算CUDA (录播答疑)

(五)并行计算与异步网络引擎workflow

(六)物联网通信协议mqtt的实现框架mosquitto

6、云原生专栏

(一)Docker

(二)Kubernetes

7、性能分析专栏

(一)性能与测试工具

(二)观测技术bpf与ebpf

(三)内核源码机制

8、分布式架构

(一)分布式数据库

(二)分布式文件系统(录播答疑)

(三)分布式协同

9、上线项目实战

(一)dkvstore实现(上线项目)

(二)图床共享云存储(上线项目)

(三)微服务即时通讯(上线项目)

(四)零声教学AI助手一代(上线项目)

(五)魔兽世界后端TrinityCore (上线项目)

10、适宜的工程师人群(共分为8大群体)

  • 1.从事业务开发多年,对底层原理理解不够深入的在职工程师

  • 2.从事嵌入式方向开发,想转入互联网开发的在职工程师

  • 3. 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师

  • 4.从事非开发岗位(算法岗,运维岗,测试岗),想转后台开发岗位的在职工程师

  • 5.工作中技术没有挑战,工作中接触不到新技术的在职工程师

  • 6.自己研究学习速度较慢,不能系统构建知识体系的开发人员

  • 7.了解很多技术名词,但是深入细问又不理解的工程师

  • 8.计算机相关专业想进入大厂的在校生(本科及以上学历,有c/c++基础)

11、配套书籍资料

  • 1. MySQL: 《高性能MySQL 第3版》

  • 2. Nginx: 《深入理解Nginx: 模块开发与架构分析(第2版)》(陶辉)

  • 3. Redis: Redis设计与实现 (黄健宏)

  • 4. Linux内核: 《深入理解Linux内核架构》 (郭旭 译)

  • 5. 数据结构与算法:《算法导论》(第3版)

  • 6.性能分析:《性能之巅洞悉系统、企业与云计算》

  • 7. MongoDB: 《MongoDB权威指南》

  • 8. Ceph: 《Ceph分布式存储学习指南》 (Ceph中国社区)

  • 9. Docker: 《Docker容器 与容器云(第2版)》

  • 10. TCP/IP: 《Tcp/Ip详解卷一卷二卷三》

  • 11. Linux系统编程: 《Unix环境高级编程》

  • 12. 计算机: 《深入理解计算机系统》

  • 13. DPDK: 《深入浅出DPDK》

  • 14. k8s: 《Kubernates权威指南》 龚正等编著

  • 15. bpf: 《BPF之巅洞悉Linux系统和应用性能》

学习成果检验

  • 腾讯offer比例15%

  • 知名企业offer比例73%

  • 最高offer腾讯T3.1(现T9)年薪65w

  • 最高年薪涨幅30W

  • 最快跳槽学习时间1个半月

如果是想在c/c++开发方向得到有效的快速提升(不是所谓的速成),这份学习体系是大家绕不过的具有参考意义的提升路线。从学习路线中可以对c/c++开发方向的技术栈有一个清晰的认识。

最后:

给校招的小伙伴一句话:第一份工作不亚于一次高考,珍惜校招,社招的竞争是你目前想象不到的。能去大厂觉不妥协,IT行业第一份工作背景越好,起点越高,后续发展空间越好!

给那些1-3年的安于现状的伙伴一句话:

不要抱怨市场,不要安于现状,在低端,往中端领域看,在中端往高端领域看。认知以及对自身的要求,都会有所改变。

给那些担心35岁的伙伴一句话:

决定上限的不是年纪,而是技术。

最后:希望学习路线对你有所帮助,希望码农的我们越来越好!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法练习Day41】买卖股票的最佳时机买卖股票的最佳时机 II

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 买卖股票的最佳时机买卖股票…

办公神器!2024年值得拥有的10款在线画板软件!

随着科技的进步和互联网的普及&#xff0c;我们工作、学习和生活方式发生了翻天覆地的变化。在线画板软件就是在这个背景下应运而生的一种便捷工具。它不仅满足了我们随时随地绘制图像、演示思路的需求&#xff0c;还提供了协同编辑、云存储等功能&#xff0c;使得团队协作变得…

Java面试题(高频、有答案,全网最强)

原文网址&#xff1a;Java面试题&#xff08;高频、有答案&#xff0c;全网最强&#xff09;-CSDN博客 这是一套全网最强的Java面试题&#xff0c;吊打网上所有Java面试题。 此套面试题的威力&#xff1a;看过这套题的朋友、同事、粉丝参加了面试后说&#xff0c;他们面试被问…

基于C#的GRPC

GRPC gRPC&#xff08;gRPC Remote Procedure Call&#xff09;是由Google开发的高性能、跨语言的远程过程调用框架。它基于HTTP/2协议进行通信&#xff0c;支持多种编程语言&#xff0c;包括C, C#, Java, Python等&#xff0c;使不同语言的应用程序可以通过远程调用相互通信。…

SPASS教程-入门

常用的统计工具 EXCEL 严格说来并不是统计软件&#xff0c;但作为数据表格软件&#xff0c;有一定统计计算功能。对于简单分析&#xff0c;Excel还算方便&#xff0c;但随着问题的深入&#xff0c;Excel就不那么“傻瓜”&#xff0c;需要使用函数&#xff0c;甚至根本没有相应…

​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】 课本里章节里所有蓝色字体的思维导图

Spire.Office for Java 8.10.2 同步更新Crk

Spire.Office for Java 是 E-iceblue 提供的企业级 Office Java API 的组合。它包括Spire.Doc for Java、Spire.XLS for Java、Spire.Presentation for Java、Spire.PDF for Java和Spire.Barcode for Java。 开发人员可以使用Spire.Office for Java在Java应用程序中执行各种办…

【electron】【附排查清单】记录一次逆向过程中,fetch无法请求http的疑难杂症(net::ERR_BLOCKED_BY_CLIENT)

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ Adblock等插件拦截2️⃣ 【失败】Content-Security-Policy启动服务器json-serverhtml中的meta字段 3️⃣ 【失败】https vs httpwebPreferences & allowRunningInsecureContent disable-features 4️⃣ 【失败】检测fetch…

技术分享 | app自动化测试(Android)--元素定位方式与隐式等待

元素定位是 UI 自动化测试中最关键的一步&#xff0c;假如没有定位到元素&#xff0c;也就无法完成对页面的操作。那么在页面中如何定位到想要的元素&#xff0c;本小节讨论 Appium 元素定位方式。 Appium的元素定位方式 定位页面的元素有很多方式&#xff0c;比如可以通过 I…

初识Java 17-2 反射

目录 转型前检查 构建例子&#xff1a;生成层次结构 优化Creator&#xff1a;使用类字面量 优化PetCounter&#xff1a;动态验证类型 更通用的递归计数 注册工厂 本笔记参考自&#xff1a; 《On Java 中文版》 转型前检查 当我们使用传统的类型转换&#xff0c;例如&…

实战!工作中常用的设计模式

文章目录 前言一、策略模式1.1、 业务场景1.2 、策略模式定义1.3、 策略模式使用1.3.1、一个接口&#xff0c;两个方法1.3.2、不同策略的差异化实现1.3.3、使用策略模式 二、责任链模式2.1、业务场景2.2、责任链模式定义2.3、责任链模式使用2.3.1、一个接口或者抽象类2.3.2、每…

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器

信号发生器 方波&#xff0c;就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加&#xff0c;Mode为0则减&#xff1b;只要为0就输出zero 这样会出问题&#xff0c;因为要求是十进制&#xff0c;但是这里并没有考虑到9之后怎么办&a…

openvino学习(一)ubuntu20.04安装openvino2022

安装openvino2022要求 操作系统 Ubuntu 18.04 长期支持 (LTS)&#xff0c;64 位 Ubuntu 20.04 长期支持 (LTS)&#xff0c;64 位 软件 CMake 3.13 或更高版本&#xff0c;64 位 GCC 7.5.0&#xff08;适用于 Ubuntu 18.04&#xff09;或 GCC 9.3.0&#xff08;适用于 Ubunt…

工具介绍——第三方软件远程连接(工具:Rustdesk)

文章目录 前言一、使用工具二、开始演示1、拿下目标主机权限后上传文件2、运行目标主机上的rustdesk-1.1.9.exe文件3、目标主机上whoami查看现在的用户4、查找目标主机上连接的文件&#xff0c;并添加连接密码5、目标主机重启rustdesk的应用程序6、本地连接主机 前言 这里主要…

“第六十三天”

这两天怎么做的这么别扭&#xff0c;为什么我的vs 的strlen函数包括终止字符了&#xff1b; 哦哦&#xff0c;明白了&#xff0c;fgets函数读取在未达到指定字长&#xff0c;或者遇见空白符之前&#xff0c;会读取前面的所有字符&#xff0c;所以会读取换行符&#xff0c;而get…

康耐视深度学习ViDi-View菜单介绍

Accept View承认当前图片标注的有效性 Clear Marking 清除当前图片的标注特征 Clear Marking & Labels清除当前图片的标注特征和标签 Process处理当前图片 Edit ROI编辑检测的区域 Edit Regions编辑(标注)特征区域 Edit Mask 编辑遮挡(屏蔽)区域 Apply Mask To Tool将遮挡(…

杨辉三角(Java实现)

public class Demo09 {public static void main(String[] args) {//第一位和最后一位都为1//除了每行的第一列之外,其余的数为a[i][j]aa[i-1][j]a[i-1][j-1];int[][] arrays new int[10][10];for(int i 0;i<10;i){if(i0){ //第一行直接赋值为0arrays[i][0]1;continue;//重…

深入理解强化学习——多臂赌博机:基于置信度上界的动作选择

分类目录&#xff1a;《深入理解强化学习》总目录 因为对动作—价值的估计总会存在不确定性&#xff0c;所以试探是必须的。贪心动作虽然在当前时刻看起来最好&#xff0c;但实际上其他一些动作可能从长远看更好。 ϵ − \epsilon- ϵ−贪心算法会尝试选择非贪心的动作&#xf…

ZipInputStream解压报错java.lang.IllegalArgumentException: MALFORMED

背景 使用jdk自带的zip工具ZipInputStream&#xff0c;去读取使用winrar在中文windows制作出来的zip文件报错。 Exception in thread "main" java.lang.IllegalArgumentException: MALFORMEDat java.util.zip.ZipCoder.toString(ZipCoder.java:58)at java.util.zip…

Qwt QwtWheel绘制滚动轮

1.简介 QwtWheel 是一个用于实现滚动轮控件的类库。它基于 Qt 框架&#xff0c;并提供了一些方便的功能来处理滚动轮的事件和绘图。 QwtWheel 类继承自 QWidget类&#xff0c;用于定义滚动轮控件的通用行为。QwtWheel 添加了特定于滚动轮的功能。 QwtWheel 可以用于创建具有滚…