qswh 发表于 2023-10-3 19:28:35

C++ 程序员入门需要多久,怎样才能学好?

C++ 程序员入门需要多久,怎样才能学好?

zcheng5979640 发表于 2023-10-3 19:28:44

看你是自学还是跟班学习,以及每天大概有多少时间用来学习,你的学习效率如何~
自学的话,C++难度你学1年可能都学不好,跟班学习的话,一般6个月周期左右,都会给你安排好!
首先来了解一些C++的相关信息:
什么行业需要c++?(对延时要求高的应用)


[*]嵌入式应用开发
[*]编译器
[*]高性能计算(cuda,opencv)
[*]大型2d,3d游戏
下面是大厂C++程序员总结出来的学习大纲,记得点赞收藏哦!


在饥人谷学编程:原来学习C++没有想象的那么难!
我们为何要学习C++?

高性能
在对执行效率有严格要求的领域,例如数据库引擎、编程语言编译器、游戏和音视频等领域,C++几乎是无可替代的选择。
兼容C语言
可以很方便地调用操作系统的底层接口。
跨语言支持
其他诸如Python, Java等各种语言都提供了调用C++库的能力,例如Tensorflow就是用C++实现内核而对外提供Python接口。
抽象能力
支持面向对象、函数式、泛型等编程范式,具有丰富的语义表达能力。
强大的社区
开发者中高手众多,Google, Microsoft, Intel, Tencent等大厂均积极参与。
完善的工具链
在众多大厂的支持下,拥有完备的编译、调试、分析、优化等工具。
灵活性
开发者可以自主管理内存、CPU等资源的分配,按需采用不同的策略。
不可替代性
学习C++可以掌握多种编程范式,掌握阅读其他语言源码的能力,使学会其他语言变得轻松,具有更高的不可替代性。

人才稀缺
由于C++语言的难度、适用层面等因素,造成了C++人才的稀缺,企业想要招一个能快速上手公司业务的人才需要很长周期或者花大量的时间进行培养。
因此能够熟练掌握C++,会使你在市场上的竞争力大大增加。
下面是大厂程序员整理的C++的学习大纲,希望对需要的朋友,提供帮助

阶段一:c++基础

c++简介


[*]c++历史;
[*]c++标准;
[*]环境搭建;
[*]第一个程序创建
基本语法


[*]初识 c++;
[*]语句;
[*]函数
基础类型


[*]简单变;
[*]算术运算符;
[*]数组字符串


[*]结构体
[*]枚举
[*]指针
循环,分支语句,逻辑运算符


[*]for 循环
[*]while 循环
[*]do while 循环
[*]if 语句
[*]逻辑表达式
[*]switch 语句
[*]break continue 语句
函数


[*]函数的基本知识
[*]函数参数和按值传递
[*]函数,数组和二维数组
[*]函数结构
[*]递归函数
[*]函数指针
[*]内联函数
[*]引用变量
[*]默认参数
[*]函数重载
[*]函数模版
对象和类


[*]面向对象编程
[*]抽象和类
[*]类的构造函数和析构函数
[*]this 指针
[*]作用域
[*]运算符重载
[*]友元
[*]类的类型转换
[*]动态内存和类
[*]深入函数返回对象
[*]对象指针
类的继承


[*]基类介绍
[*]公有继承
[*]私有继承
[*]保护继承
[*]多重继承
[*]继承和动态内存分配
[*]类设计
[*]嵌套类
[*]RTTI
stl 标准模板库


[*]string 类
[*]智能指针
[*]标准模版库
[*]泛型编程
[*]函数对象
[*]算法
[*]容器以及其他
阶段二 对象内存模型

关于对象


[*]对象模型
[*]struct 和 class 的区别
[*]面向对象编程与其他的区别
构造函数


[*]默认构造函数
[*]拷贝构造函数
[*]类型转换
[*]构造函数初始化成员变量
成员变量


[*]成员变量的绑定
[*]成员变量的内存布局
[*]成员变量的存取
[*]继承和成员变量
[*]对象成员的效率
[*]成员指针变量
成员函数


[*]成员函数类型
[*]虚函数
[*]成员函数指针
[*]内联函数
[*]局部变量
对象的构造,析构,拷贝


[*]无继承下的对象构造
[*]有继承下的对象构造
[*]对象拷贝效率
[*]对象析构
对象运行期


[*]对象的构造和析构
[*]new 和 delete 运算符
[*]临时对象
对象模型总结


[*]模版
[*]异常处理
[*]执行期类型识别(RTTI)
[*]动态库,动态内存
阶段三: C++11

新增功能


[*]新类型
[*]统一初始化
[*]声明
[*]智能指针
[*]右值引用
[*]包装器
[*]并行编程
[*]其他
新的类功能


[*]特殊的成员函数
[*]默认方法,禁用方法
lambda 函数


[*]比较函数指针,函数符,lambda 函数
[*]为何使用 lambda 函数
阶段四 并发编程

并发介绍


[*]什么是并发
[*]为什么使用并发
[*]在 c++中使用并发和多线程
线程使用


[*]基本线程管理
[*]传递参数给线程函数
[*]转移线程所有权
[*]在运行时选择线程数量
[*]标识线程
线程间数据共享


[*]线程之间数据共享问题
[*]用互斥变量保护共享数据
[*]用于共享数据保护的替代工具
异步操作


[*]等待条件
[*]使用 future
[*]可超时的等待
[*]使用操作同步
原子操作


[*]内存模型基础
[*]原子操作以及类型
[*]同步操作
线程安全数据结构(有锁)


[*]并发设计的含义是什么
[*]基于锁的并发数据结构
[*]设计更复杂的基于锁的数据结构
线程安全数据结构(无锁)


[*]定义和结构
[*]无锁数据结构的例子
[*]编写无锁数据结构
数据并发设计


[*]在线程间划分工作的技术
[*]影响并发代码性能的因素
[*]为多线程性能设计数据结构
[*]为并发设计时的额外考虑
[*]在实践中设计并发代码
线程管理


[*]线程池
[*]中断线程
多线程调试


[*]并发相关错误的类型
[*]定位并发相关的错误技巧
[*]总结
阶段五 性能优化

优化概述


[*]为什么要优化
[*]优化策略
影响优化的计算机结构


[*]计算机硬件特性
[*]c++特性
测量性能


[*]分析程序执行
[*]热点代码
优化字符串


[*]优化字符串的几种方式
[*]消除字符串转换
优化算法


[*]算法的时间开销
[*]优化查找和排序的工具箱
[*]高效查找算法
[*]高效排序算法
[*]优化模式
优化动态分配内存


[*]c++变量回顾
[*]c++动态变量回顾
[*]减少动态变量的使用
[*]减少动态变量的重新分配
[*]移除无谓复制
[*]实现移动语义
[*]扁平数据结构
优化热点语句


[*]从循环中移除代码
[*]从函数中移除代码
[*]优化表达式
[*]优化控制流程
使用高性能库


[*]优化标准库的使用
[*]优化现有库
[*]设计优化库
优化查找和排序


[*]使用 map
[*]改善查找性能的工具箱
[*]使用 algorithm 头文件进行算法优化
[*]优化 map
优化数据结构


[*]理解标准库容器
[*]vector 与 string
[*]deque
[*]list
[*]forward_list
[*]map 与 multimap
[*]set 与 multiset
[*]unordered_map 与 unordered_multimap
优化 I/O


[*]读文件技巧
[*]写文件技巧
优化并发


[*]复习并发
[*]复习 c++并发方式
[*]优化多线程 c++程序
[*]让同步更加高效
[*]并发库
优化内存管理


[*]复习 c++内存管理器 api
[*]高性能内存管理器
[*]提供专用内存管理器
[*]自定义标准库分配器
阶段六:项目实践

6.1 linux 多线程服务端

涉及技术:C++ Socket 多线程
C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的 主流常规技术,一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模 式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本项目宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步 的功能需求。掌握一种进程间通信方式和一种多线程网 络编程模型就足以应对日常开发任务,编写运行于公司级分布式服务系统。
6.2 支持并行计算和异步网络通讯的工作流框架

涉及技术:C++ 多线程
一个C++服务器引擎,其支持大量后端C++在线服务,是一个设计轻盈优雅的企业级程序引擎,其能帮助我们快速的完成下列工作:
1.快速搭建http服务器。
2.万能异步客户端。目前支持http,redis,mysql和kafka协议。
3.构建异步任务流,支持常用任务的串并联,也支持更加复杂的DAG结构。

带你一起来

[*]熟悉C++语言特性和标准库;
[*]掌握计算机科学的基本理论知识和常用算法设计技术;
[*]能够独立设计开发一个工程项目;
[*]胜任相当于阿里P6及以上的开发工作;
特点

[*]逻辑性 - 由浅入深地呈现知识点,并配合对应的编码实战。
[*]综合性 - 体现知识点之间的关联性,形成结构化的的体系。
[*]实践性 - 理论知识和工程实践相结合,提高开发能力。

lovefox 发表于 2023-10-3 19:29:23

我们都知道,C++是所有语言的基础 !记得在大学毕业之后,做了C++的后端开发当然还有一些嵌入式的相关的工作,到现在换工作,工作机会依然那么多,到了一定的阶段,我想你不是在找工作,而是工作在找你 !
C语言作为系统设计语言,编写工作系统应用程序,但是随着标准版本的演进,C++ 里包含的东西也越来越多。比如你要学习的C++的技术栈有:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等多个知识点都需要去学习的
如何学习C++呢?

第一阶段,语法基础

如变量、数据类型、运算符等。了解控制流语句,如条件语句、循环语句等。在学习变量的时候,最重要的volatile、mutable、unique_ptr,此外还有函数的定义和调用,特别是实参和实惨的传递,举个例子:
如果在函数调用过程中,进行参数的传递,如果是不可变对象,则函数体的修改不会影响实参的值 ,如果是可变对象,在函数体内的修改会影响到实参的值 这也是面试中常温的一个问题!
第二阶段,C++核心

类、对象、继承、多态等。在学习的时候,一定要去掌握C++的标准库,如输入输出流、容器、算法等。学习异常处理和模板编程。比如,智能指针:shared_ptr,weak_ptr,std::exception,try/throw/catch,noexcept,短发的话,可以去了解遍历算法,排序算法,查找算法
你可以每天不停地用C+写一个小算法,比如快排,倒叙,Tree算法,如有有必要,可以给自己定义一个小目标,每天刷一个算法,我每天还在坚持一篇算法,去大公司的时候是非常的必要的一个考点!
第三阶段,高级特性

其实个人觉得高级特性还是蛮多的,比如内存管理,包括动态内存分配和智能指针,文件操作和异常处理机制。学习C++的多线程编程和并发控制,这个时候可以写一些小程序了,向文本中做个打印机的效果,写个五子棋的小游戏之类的
第四阶段,网络通信和脚本以及性能优化

在使用C++开发网络通信功能时,首先需要选择一个合适的网络库。一个好的网络库不仅能提供丰富的网络功能,还能提供高性能的网络通信。
一些常用的C++网络库有Asio,Boost.Asio,POCO个人建议是使用POCO。毕竟是一个轻量级的C++类库,其中包含了许多工具和组件,包括网络通信。POCO的网络库提供了一组简单易用的类,支持TCP、UDP和HTTP等网络协议。
根据不同的需求和使用场景,可以选择合适的网络库来开发高性能的网络通信功能。
比用C++30行代码就可以实现编写一个简单的聊天程序
第五阶段Mysql数据库

数据库对于以后工作是肯定会用到的,如果有时间建议将基础打好,可以先看数据库系统概念,了解数据库的基础知识 ,Mysql服务器的安装与配置 、数据表的的新建、查询等CRUD、事物的使用以及其ACID特性,特别是作为C++开发者来讲,常用的sql语言,ddl语言,数据的优化,建索引,视图,触发器,存储过程啊,数据库备份啊,游标啊,等等,很多要会的。
常用 SQL 操作

http://picx.zhimg.com/v2-26fb0dc03a5f851d507981137186e0d7_r.jpg?source=1940ef5c
当你学会INSERT, SELECT, UPDATE, DELETE几种操作的SQL语法以及如何来操作数据库的时候,你就可以做一个完整的小项目了!
一个脑图分享给大家


http://pic1.zhimg.com/v2-7f30616decdf7e3de82162996f137fe8_r.jpg?source=1940ef5c
C++的语法除了一大堆的对象,模式定义, 其中最难的地方在于对内存的理解掌握,以及对指针的理解掌握, 这个不是看几天书,写几行代码就能摸透的,需要大量的时间与实践.
熟悉目前环境下一些云原生的开发,

包括开发摄像头接入组件,onvif接入、rtsp接入;
另外ffmpeg,以及MFCwindows界面开发,毕竟现在C++可以结合AI做一些大规模语言模型的一些支持,毕竟目前ACGI字当前最流行的一门技术了
如果你还不了解ACGI,如果你想知道更多的AI方面的知识,这里有「知乎知学堂」和「AGI课堂」联动,推出的【程序员的AI大模型进阶之旅】公开课,一共2天的课程,别看仅仅两天的课程,我们可以学到利用AI拆解业务,利用用最优方案独立开发 AI 产品的能力,对自己以后的工作效率有很大的提升,全方位的帮大家提升认知和AI技术能力,成为第一批AI布道师!
C++学习书籍推荐

在学校书籍的时候,当然可以一边阅读一边敲代码,照着书本的实例或者习题撸一遍代码。
入门级书籍
《C++ Primer》

http://picx.zhimg.com/v2-5431cadbd4b4d88bda6bc0febd2077de_r.jpg?source=1940ef5c
内容很全面,循序渐进,非常适合自学。这本书籍C++对象在内存中是怎么存储,以及成员函数是如何调用。每章末设计了大量复习题和编程练习,帮助读者巩固所学知识和提高实际编程能力。
《C++编程规范(C++ Coding Standards) 》

http://picx.zhimg.com/50/v2-622743857904782824fc4d03fcd28592_720w.jpg?source=1940ef5c
“编程规范”这里并不是”代码缩进要用几个空格”。这本书包含了101个例子、惯用法、缺陷,通过这些可以帮助你编写正确、清晰高效的C++代码。书中对每一条 规范都给出了精确的描述,并辅以实例说明;从类型定义到错误处理,都给出了最佳的C++实践
《大规模C++程序设计》

http://pica.zhimg.com/50/v2-cbf93558abf86a47ef92285d45aa55e9_720w.jpg?source=1940ef5c
本书介绍了如何管理大规模C++软件项目的技术,比如你可以把把当前的项目代码作了不小的重构,主要是从程序的物理结构方面,分层更明确,实现隐藏更彻底,编译耦合进一步降低,自己感觉还不错哦!
《C++性能优化指南》

http://picx.zhimg.com/v2-5dd7544b9a8284c63e0616d20822f0a7_r.jpg?source=1940ef5c
书中从多个角度深入浅出地介绍了 C++ 的性能优化方法,包括 CPU 缓存、指针和引用、内存池、智能指针等多个方面。同时,书中也提供了大量的代码实例和性能测试数据,帮助读者更好地理解和实践这些优化方法。
此外还有
《More Effective C++中文版》
《C++ STL 中文版》
《Effective C++》
《Accelerated C++中文版》
《C++设计新思维》
《C++代码设计与重用》
高级阶段

技术点:tcp服务器,如何升级https服务器,epoll的实现,reactor的原理与实现,百万并发,websocket协议,Redis,memcached。nginx网络组件.UDP可靠传输,QUIC,kcp.posixAPI网络协议栈 ,比如你可以利用redis写一个中间件之类的
学习C++推荐的5个编程软件

visual studio
号称全宇宙第一IDE,可以用来开发c++、c#、asp等,现在很多公司和个人都在用,方便团队协作,开发效率高,使用起来非常方便。
code blocks
也是一个开源的IDE,可以跨平台,也就是说windows、linux、macOS都可以用。
MinGW
MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序
GNU C
他是一个按照LGPL许可协议发布的,公开源代码的,免费的,方便从网络下载的C的编译程序!
Dev-C++
Dev-C++是一款小巧方便的编译器,开源的c++ ide,一键下载安装,无需任何多余配置,有中文版本 。就给那些刚刚学习编程的同学讲一下这个软件的安装和基本的编译以及一些使用的技巧
一定要项目实战

看遍代码一万行,不如下场写一行. 任何一门编程语言的学习,都需要做到有的放矢——项目实战。离开了项目实战,阅读编程书籍学习效率将大打折扣 要在代码里进行一遍一遍的历练, 实际敲过,运行过,调试过的代码,才是真正被你掌握的代码!
举个例子
一个开源的TinyHttpd项目,麻雀虽小,五脏俱全。我们都知道Tiny 为极小的,Http 为应用层协议,当我们输入网址回车的那一刻就看到页面上想看到的内容,这里就涉及到HTTP协议。
这个项目可以让你清楚的了解 Http 请求头,响应头等细节信息,同时代码中使用多进程的方式对 Http 进行了实现。
最后

对初学者的新手而言,则是应当静下来,不必心浮气躁。C++是一门啃着最有滋味的编程语言,痛苦并快乐着。要变成C++的开发人员,必须要坚持不懈的去学习和实践项目,只要你行动起来,就一定能学好!

猪头他爸 发表于 2023-10-3 19:29:48

同样要看情况。依赖于你的经验,也依赖于你所说的‘学习C++’的意思。对大部分程序员而言,学习语法和用更好的C的风格写C++,再加上定义和使用几个简单的类,只要一两周时间。这是最容易的部分。最主要的困难在于掌握新的定义和编程技术,这也是最有意思、最有收获的部分。曾经和我讨论过的大部分有经验的程序员说,他们用了半年到一年半时间,才真正觉得对C++ 适应了,掌握了它所支持的数据抽象和面向对象技术。这里假定他们是在工作中学习并维持着生产——通常在此期间也用着C++的某种‘不那么大胆’的风格做程序设计。如果你能拿出全部时间学C++,就可能更快地适应它。但是,在没有将新的思想和设计应用到真实的项目中之前,这个适应也很可能是骗人的。面向对象的编程和面向对象的设计,基本上是实践性的训练而不是理论训练。只是对一些玩具式的小例子使用或者不使用它,这些思想就很可能演化为一种危险的盲从倾向。

http://pic1.zhimg.com/v2-4399c4f9ce60156032f87eb51efc2328_r.jpg?source=1940ef5c
请注意,学习C++,最根本的是学习编程和设计技术,而不是语言细节。在做完了一本教科书的学习工作之后,我会建议一本有关设计的书,例如 ,该书里有一些稍长的例子,用的是5种语言(Ada、CLOS、CLU、C++、Smalltalk和Object Pascal),这样就可能在某种程度上避免语言的偏狭性,而偏狭性已经弄糟了许多有关设计的讨论。在这本书里,我最喜欢的部分就是描述设计概念和例子的那几章。
关注设计方式,与非常仔细地关注C++ 的定义细节(例如ARM,其中包含许多有用的信息,但是没有关于如何用C++ 编程的信息)是截然不同的。把注意力集中到细节上,很容易把人搞得头昏脑涨,以至于根本就用不好语言。你大概不会试着从字典和语法去学习一种外国语吧?
在学习C++ 时,最根本的,应该是牢记关键性的设计概念,使自己不在语言的技术细节中迷失了方向。如果能做到这一点,学习和使用C++ 就会是非常有趣的和收效显著的。与C比较,用一点点C++ 就可能带来许多收获。在理解数据抽象和面向对象技术方面付出进一步努力,你将能得到更多的收获。”这个观点也不是全面的,受到当前工具和库的状况的影响。如果有了保护性更强的环境(例如包括了广泛的自动的运行时检查)以及一个小的定义良好的基础库,你就可以更早地转到大胆使用C++ 的方面去。这些将能更好地支持从关注C++ 的语言特征到关注C++ 所支持的设计和编程技术的大转移。
分散一些兴趣放到语法上,把一些时间用到语言的技术细节上,也是非常重要的。有些老牌程序员喜欢翻弄这些细节。这种兴趣与不大情愿去学习新的程序设计技术,经常是很难分辨清楚的。
类似地,在每个课程和每个项目里总有这样的人,他们根本不相信C++ 的特征是可以负担得起的,因此在后来的工作中坚持使用自己更熟悉和信任的C子集。只有不多的有关个别C++ 特征和用C++ 写出的系统的执行效率方面的数据(例如,、、),不大可能动摇这些人长期而牢固的,有关比C更方便的机制是不可能负担的观点。看到这种宣传的量,与语言或工具领域中未得到满足的允诺的量的比较,人们应该对这种说法持怀疑态度,并要求拿出更明显的证据。
在每个课程和项目里也总有另一种人,他们确信效率无关紧要,倾向于用更一般的方式去设计系统,结果是,即使在最先进的硬件上也产生了可观察到的延迟。不幸的是,这种延迟在人们学习C++ 的过程中写玩具程序时很难观察到,因此具有这种性质的问题常常被遗留下来,直到遇到真正的项目。我一直在寻找一个简单但又实际的问题,如果采用一种过分一般的方式去解决,它就能打倒一个很好的工作站。这样的问题将使我能证明带有倾向性的设计的价值,以抵制那些极端的乐观主义者;而通过仔细思考又能使性能大大改善,可以对付过于谨慎和保守的人们。
此回答摘自C++语言之父的经典著作《C++语言的设计和演化》
《C++语言的设计和演化(异步图书出品)》([美]本贾尼·斯特劳斯特卢普,[,Bjarne,Stroustrup,])【摘要 书评 试读】- 京东图书

zsqffff 发表于 2023-10-3 19:30:09

程序员这个行业都比较务实,比较谦虚,大牛也不敢说自己牛,都说才入门,所以路漫漫,你就自己体会吧

boat 发表于 2023-10-3 19:30:42

初学屁嘛不会的时候,手拿一本c++ primer,炕次炕次用了两个月。当时觉得自己蛮OK的,肯定是入门了啊!
现在看当时,就是 too young,too simple,sometimes naive,现在撸boost也能炕次炕次撸下来,勉强算是入门了吧,回首一望,两年了..
除了多学多练多看,我想没什么好办法..
页: [1]
查看完整版本: C++ 程序员入门需要多久,怎样才能学好?