如何学习C++编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何学习C++编程相关的知识,希望对你有一定的参考价值。
我现在工作有时会用到VC编写简单动态库,为了将来的发展,希望能够把C++学精,之前有一些C和C++编程的底子,最近把C++ Premier这本书看完了,但是稍微看了一些别的资料之后发现不断出现自己从来就没见过的库啊接口啊,而且在自己按照书上的例子编写程序时发现出现了很多完全都记不住的东西和流程,请问学习C++应该遵循一种什么进度或者方式,谢谢。
大一学习的c++,工作之后也一直用的c++。
1. 涵盖c++入门到精通的图书列表
《The C programming language》必读
《C++ Primer》,号称是一本可以让你从C或JAVA程序员转为一个真正的C++程序员的入门参考书,必读。
《The C++ programming language》,C++之父,人称B教主著作,在看过C++ primer后,应该可以跳章选读。
《Think in c++》,网上说此书的中文版翻译质量奇差,推荐看影印版,选读。
《Effective c++》,类似 Effective java,讲的是最佳实践,程序员必读。
《More effective c++》,上书的补充。
《The C++ standard library》,会写C,不会用标准库怎么行。这就跟java程序员不会用java.util包一样,必读。
《Effective STL》,STL库的最佳实践。Effective C++作者又一力作,必读。
《The annotated STL source》,STL源码分析,这本书应该算是深入/精通类了,选读。
《Generic programming and STL》,号称C++编程里,就是跟模板,泛型打交道,那么精通泛型是势在必行。
《C++ Template》,C++模板编程,代码复用的经验之道,必读。
《Exceptional C++》,跟Effective C++类似,属于最佳实践和难题解析,书中列出了许多应用场景和实例代码供读者揣摩,选读。
《More Exceptional C++》,上书的补充。
《Exceptional C++ Style》,上上书的补充
《Inside The C++ Object Model》,有了上面这些书做铺垫,那么终于可以读此神书了。它会带你游览C++对象模型的底层实现机制。读完此书,任何C++代码看起来如同行云流水,必读。
2. 优秀的C/C++开源项目(阅读代码)
OS:Linux kernel LVS、Linux应用程序
DB:mysql、PostgreSQL
Complier:VM、GCC
Framework:OpenSip、SipProxy、
Net:ACE(Java Mina、Netty)、TCP/IP、HTTP协议栈
Cache:Memcached、Redis、
Library:STL(java util package)、Boost、Qt(UI)、
balance:Apache、nginx
GSL
地址:https://github.com/microsoft/GSL
Boost文档
地址:https://www.boost.org/doc/libs/
wxWidgets官网
地址:http://wxwidgets.org/
gtkmm
地址:https://www.gtkmm.org/en/
CopperSpice
地址:https://www.copperspice.com/
Qt
地址:https://www.qt.io/Eigen
地址:http://eigen.tuxfamily.org/index.php?title=Main_Page#Documentation
Plot utils
地址:https://www.gnu.org/software/plotutils/
Asio
地址:https://think-async.com/Asio/
POCO
地址:https://pocoproject.org/
abseil
地址:https://abseil.io/
C++开源库汇总列表
地址:https://en.cppreference.com/w/cpp/links/libs
除了这些开源项目,也可以找一些免费的公开课,那这里也推荐一个ACM金牌大佬讲授的免费C++课程,可以去体验一下:
学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样
已失效
3.C++语法讲解
语言基础
详细介绍变量、表达式、语句、指针、数组、流程控制、函数、文件组织等。
抽象机制 - 面向对象编程
深入讲解C++的抽象机制,封装(类)、继承、多态;操作符重载、函数对象、异常处理等。
模板 - 泛型编程
详细介绍C++的模板机制,类模板、函数模板、模板特化等方面的内容。
4.深入c++面向对象
4.1、从C到C++
引用和指针:为什么引用很重要
const关键字:为什么const很重要
名字空间 (namespace)
4.2、深入C++对象
关于C++对象
内置类型的对象,如int、double对象,自定义类型的对象
对象类型的定义
关键字class和struct
类成员:成员函数和数据成员
静态数据成员
成员的访问控制
对象的size
关于this指针
onst成员函数、const究竟修饰什么
mutable数据成员
4种特殊成员函数:constructor、destructor、copy constructor、operator=
对象的构造、初始化列表
对象的析构
对象的复制
什么情况下有必要显式定义4种特殊函数
C++对象生命周
4.3、操作符重载
关于C++中操作符重载机制
重要操作符重载
算术运算:+, -, *, /, %, ++, --, ...
关系运算:>, <, ==, !=
下标存取:[ ]
函数调用:(),函数对象
类型转换、单参数构造函数与隐式转换、阻止隐式转换 -- explicit关键字
友元与成员
4.4、面向对象基础 -- 继承
基类与派生类
再谈对象的构造与析构
虚函数、纯虚函数
派生类的内存布局、虚函数表
多态、多态类型、如何体现多态
虚析构、为什么虚析构很重要
4.5、关于继承更多的话题
多继承
虚继承与虚基类
对基类的访问、public / protected / private继承
Down cast:static_cast<>和dynamic_cast<>
运行期类型识别 (RTTI)
4.6、C++与面向对象设计
C++语言机制提供了完整的OOP支持
超越继承
OOP若干法则和设计模式
5.C++泛型编程与STL
5.1、C++ 模板机制
5.2、STL 概要
5.3、STL容器
5.4、STL迭代
5.5、STL算法
5.6、预与定义STL数对象
5.7、STL适配器
6. C++进阶
《C++ Primer》最新版本:第三版(第四版国外已上架, 国内一些网上书店也在预订中)
适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是 好事。
《The C++ Programming Language》/《C++程序设计语言》
最新版本:第三版特别版
简称 TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来)
《Essential C++》
《Accelerated C++》
这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。
以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。
《Effective C++》
最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中)
简称EC。C++程序员必读!很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。
《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 编程规范》
个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系 列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言,关于“为什么这么做”的问题,解释的不够。
我 的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不 会过时,人们将广为传诵它制定的101条戒律。
还不知道他的简称,也许“101”会成为一个候选者?
提到《Effective C++》,那么另外三本书一一浮出水面:
《More Effective C++》
《Exceptional C++》
《More Exceptional C++》。
新书《Exceptional C++ Style》也是值得一看的好书。
上 述几本书,一本也不应该放过。
个人建议上述书籍按顺序阅读。并且,在将来反复阅读这几本书。
《Thinking in C++》/《C++编程思想》
这本书及其中文版传言好坏都有,没有认真看过,不做评价,如果确有兴趣,不妨尝试 一下该书。
以下几本书基本上涉及的都是语言本身,大体上可以按照以下的顺序阅读。
《C++必知必会》
如果早一年,这本书将是重量级的,然而它被101和《Exceptional C++ Style》盖过一头。
《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序设计陷阱》
这又是一本我未曾读过,而且广受好评的书。
《STL 源码剖析》
这本书我刚到手,就被人"借"走,以至于到现在也没有看过。看过这本书的朋友,可以给一个合适的评价。
7. C++进阶之数据结构基础
这是所有编程语言中最应该学习的部分,程序组成的基础之一。
顺序存储、链式存储、循环链表;
双向链表、栈(顺序和链式)、队列(顺序和链式);
栈的应用、树基本概念及遍历、二叉树;
排序算法、并归算法、选择、插入、快速、希尔。
以上这些内容你知道吗?
8. C++进阶之UI界面开发
掌握QT类库构架,图形界面开发模型;
掌握QT开发技巧,消息机制,图形处理;
掌握QT网络编程,UDP,TCP使用方式;
掌握QT文件处理方式,序列化;
掌握QT在windows,linux,ios,android不同平台下的移植技术。
9. C++进阶之Unix/Linux网络服务器
掌握Unix/Linux平台开发方式;
熟练使用系统调用;
熟练Unix/Linux内存管理,进程,线程调度;
熟悉网络服务器开发方式,熟练编写TCP,UCP网络服务程序;
掌握同步/异步IO模型在网络编程中的使用方式。
10.C++进阶之数据库开发
掌握SQL语言的实用技巧。Oracle,MySQL数据库的使用方式。
如果你能熟练掌握以上列出的技能,具备解决复杂问题和技术难点的能力,而且你能独立开发一些比较复杂的功能模块,那么很荣幸地告诉你,你已经达到中级水平,薪资过万对你来说简直是小菜一碟。
11.C++标准参考
C++ reference
地址:https://en.cppreference.com/w/
C++ Coding Standard
地址:http://www.possibility.com/Cpp/CppCodingStandard.html
Standard C++
地址:https://isocpp.org/
State of C++ Evolution
地址:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2597.html
The C++ Resources Network
地址:http://www.cplusplus.com/
Draft C++ Standard: Contents
地址:http://eel.is/c++draft/
1. 《C++ Primer》Lippman写的,经典中的经典,C++入门的宝典,读完这本书,基本语法过关,部分技巧掌握。
2.《The C++ programming language》C++的创始人Bjarne Stroustrup写的,这本书的权威性毋庸置疑,而且这里面讲到了一些比较底层的东西,如果你看过了《C++ Primer》的话,这本书可以跳着看,懂的就跳过。
3.《Effective C++》 Scott Meyers顶级大师用活泼幽默的语言写的书,这本书中讲到了许多应该注意的问题,这是十分值得购买的书。(Lippman曾把程序员分为看过effective c++的和没看过的两类。由此可见此书的重要性)
4.《More Effective C++》上书的姊妹篇,这本书里讲到了许多关键性的技术,对提高程序的效率是非常有帮助的。
5.《Advanced C++》这是一本神奇的书,里面讲到了许多连C++设计者都没想到的妙法,解决了许多看似不可能解决的问题。Scott Meyers曾隆重推荐过的书。
6.《Inside the C++ Objects Model》又是Lippman的大作!这本书讲到了他在开发第一个C++编译器时的许多想法,彻底解析了C++底层机制是如何实现对象模型的,看过这本书,你对C++的了解会有质的飞跃!从这刻起,你有权力说你是一个C++程序员了!
光学C++语言基本上看完上述的书就是高手了,其他经验要在实践中累积,你在看这些书的同时就应该多做一些小程序,小项目,提高水平的速度是飞快的.这是我个人的经验。另外,你学了C++还要开发程序,开发软件,无疑要使用MFC之类的东西
《API Programming》和《MFC Windows 程序设计》两书值得一看。这两本书能迅速提高你的实践水平。
最后,不要被这么多书吓倒,用起心来,很快能搞定!祝你早日成功!!
参考资料:http://zhidao.baidu.com/question/5765814.html?si=9
本回答被提问者和网友采纳 参考技术B我也是从一个C++新手小白摸爬滚打走过来的,成长为现在的大牛(自封的,嘿嘿),个人觉得,C++是这么多高级语言中比较复杂的一款(不接受反驳),并且C++相关的配套知识点太多,比如C++11,C++14,模板,STL,Boost、COM、WindowsAPI,MFC,QT 等 ! 作为小白,自学因为没有一个好的课程知识体系规划,像一个无头苍蝇,会比较懵, 先学哪些?后学哪些?都搞不清楚,前期学的很痛苦 !
我自己当时在学的时候,是买了几本书《C++程序设计》,《C++ Primer 》 ,但相对看书而言,我还是更倾向于看视频课程,你可以根据自身的学习习惯来找到适合自己的学习方法,我之前是看的这个里面的C、C++视频课程,里面的老师会告诉你正确的课程学习顺序
参考技术C 根本不用背库函数,买一本《C++标准程序库》,把里面例题敲一敲,大概了解每个函数是干什么的,每个函数具体用法,包括参数都背下来是不可能的,关键是做项目时知道什么时候该用什么函数,具体怎么用可以百度一下,很方便!关于进度,下面是我的学习过程:
C++ Premier-->STL标准模板库-->MFC 参考技术D 楼上的那些路径,让我感动,谢谢了。
终于有人把如何全面学习C++讲明白了!
话说,“学习编程,我到底应该如何选择学哪一门语言?”这应该是大多数初学者内心的烦人bug!
如果抱着“学一门语言好找工作”的心态,那可能你的眼界和学习思路都会受限变窄。“软件人员要把眼光放长远,尽量往中高级方向走,提升自己的核心竞争力,才不会被时代淘汰。”来自一位前辈的真诚建议。
所以,如果你希望把工作当成事业、深入了解软件编程的主心骨,那么C/C++这一类底层语言,是你必须要学习和掌握的。
尤其是C++,它作为C语言的延伸和强化,一直是大公司大厂钦点的开发语言。
如今自学成风,C++也不乏大佬自学……
但是,在初期找不到感觉和项目练手写代码的话,学习效率非常低。这不,这里给大家找到了一份全面的、众多初学者认可的C/C++学习计划。
每一部分计划的最后,还有学习项目(附源码)资料可以领取哦!让你少走些弯路,一直是我们的愿景。
C/C++就业领域与学习方向计划
一、嵌入式
(一)嵌入式就业领域
1、就业领域:
物联网、智能家居、智能医疗、智能汽车电子、智能硬件产品开发等
2、具体职位:
嵌入式软件工程师、嵌入式硬件工程师、嵌入式系统工程师、嵌入式应用/驱动/内核/移植工程师等
(二)嵌入式知识架构体系
1、懂硬件
懂硬件的一些原理,至少能看懂原理图,会设计原理图加分;
PCB设计软件Altium Designer,PADS等;
会结构设计,会焊板,交付专业制板公司制板
2、C/C++语言和数据结构以及简单算法
基本C/C++语法、数据类型、数组、指针、结构体、链表、类、模板、文件操作、队列、栈等
3、Linux操作系统基础
Linux操作系统的概念、安装方法;
详细了解Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和Make 项目管理工具;
Makefile Shell脚本编写等知识;
嵌入式开发环境的搭建;
SDK做二次开发
4、Linux网络编程
TCP/IP协议、socket编程、TCP/UDP网络编程、HTTP;
走物联网方向,更要了解一些与云存储相关的网络接口,比如亚马逊、阿里云等
5、外设协议与射频
简单通信接口:UART、I2C、SPI、CAN、USB、GPIO、WiFi、SDIO芯片;
网络通信接口:以太网;
其它输入接口:键盘、鼠标、AD器件、LCD、433、2.4G等无线通信模块;
走物联网方向,务必要熟悉MQTT协议
6、了解嵌入式平台系统原理
系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备;
Linux平台包括:内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader制作与原理分析、根文件系统制作,以及向内核中添加自己的模块,完整的移动软件
7、驱动开发
熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作;
熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识;
熟悉处理器各资源、掌握Linux设备驱动原理框架;
熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发;
在工作中能独立胜任底层驱动开发,做好配置
(三)嵌入式公司推荐
一线:华为海思、中兴通讯、C/C++
二线:米尔科技、周立功、联发科
(四)学习项目推荐(附源码)
某智能锁厂锁后板源码
扫描下方二维码
备注“计划”
即可获得推介学习项目(附源码)
领取仅限当日前50名
快来下载属于自己的学习干货库
二、桌面应用程序开发(MFC/QT)
(一)桌面应用就业方向
传统工业公司、工控、数字图像软件、图形渲染引擎、上位机、逆向、UI、视频会议等
(二)桌面应用知识架构体系
1、C/C++语言、常用数据结构以及常用设计模式
基本C/C++语法;
数据类型、数组、指针、结构体、链表、文件操作、队列、栈、二叉树、单例;
工厂模式、策略模式等设计模式
2、控件和组件应用
VC++控件,组件、MFC文档类;
Menu、Windows消息;
sendmsg函数、动态链接库;
Qt Core、Qt GUI、Qt Multimedia、Qt Multimedia Widgets、Qt Network、Qt QML、Qt Quick、Qt SQL、Qt Test、Qt Widgets等Qt基本模块(Qt Essentials);
应用QPainter绘图系统、QSS样式表,实现各种自绘窗口
3、操作系统原理和IDE
Windows核心编程、多线程、多进程、线程同步以及进程间的通信;
字符解析协议,如XML和Json;
熟悉VS和QT环境
4、网络编程
TCP/IP协议、socket编程、HTTP;
重点学习网络编程相关API;
了解HTTP协议及其实现方法;
熟悉UDP广播、多播的原理及编程方法;
掌握混合C/S架构网络通信系统设计;
QTCP、QHttp等实现网络编程;
异步非阻塞框架IOCP等
5、调试技术
IDA+windbg高级调试Windows;
产生dump文件进行代码调试;
使用DebugView工具调试
6、数据库设计
掌握SQL语言的实用技巧;
SQLite与Oracle、MySQL的使用方式及区别
7、良好的框架设计
(三)桌面应用公司推荐
道通科技、深信服、今日头条、迅雷、百度、360、酷狗
(四)学习项目推荐(附源码)
超级任务管理器:processhacker
三、图像处理与音视频开发
(一)图像处理与音视频就业方向
流媒体、大学里的研究所、今日头条(抖音)、优酷
(二)图像处理与音视频知识架构体系
1、C/C++语言和设计模式
基本C/C++语法、数据类型、数组、指针、类、模板等;
常用的设计模式
2、OpenCV/OpenGL知识体系和各种图像格式和视频格式
OpenCV的环境配置,数字图像处理相关知识;
图像滤波,图像识别,膨胀,腐蚀,直方分布图,二值化,灰度,目标识别、检测、定位等图像处理相关技术;
模式识别相关算法如二值化,SIFT特征,边缘轮廓检测等;
计算机图形学/计算机视觉/相机标定;
三维建模;
各种图像格式的基本概念;
rgb yuv jpg;FFmpeg常见编解码格式用法;
写MP4容器
3、操作系统原理和网络编程以及相关协议
Linux/windows操作系统核心原理、线程/进程;
tcp/udp协议 rtmp rtp RTSP
4、良好的算法能力
掌握深度学习算法原理和基本模型;
熟练使用深度学习开源框架(如TensorFlow,Keras,Caffe等);
人群、手势、人脸识别
5、良好的数学知识
熟悉matlab的使用、矩阵论;
具备阅读SCI论文等能力
6、开源代码
音视频:Live555;webrtc;
图像处理:OpenCV源码
(三)图像处理与音视频公司推荐
今日头条、优酷、三星、索尼、清华同方、腾讯研究院、部分外企
(四)学习项目推荐(附源码)
跨平台流媒体解决方案:live555项目
四、Linux后台服务开发
(一)Linux后台服务就业方向
企业级分布式服务器、智慧城市、智慧交通等场景AI后台系统;
游戏后台服务开发;
云计算、银行系统、企业web服务器等
(二)Linux后台服务知识架构体系
1、C/C++语言和设计模式
基本C/C++语法、数据类型、数组、指针、结构体、链表、文件操作、队列、栈等
2、操作系统基础
Linux操作系统的概念、安装方法,线程、进程;
详细了解Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和Make项目管理工具;
Makefile Shell脚本编写等知识
3、Linux系统编程与linux操作系统
重点学习标准I/O库,Linux多任务编程中的多进程和多线程;
进程间通信(pipe、FIFO、消息队列、信号量、共享内存、信号)同步与互斥,对共享资源访问控制等重要知识;
提升对Linux应用开发的理解和代码调试的能力;
Linux文件系统
4、网络原理与网络编程
TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、HTTP;
重点学习网络编程相关API;
熟悉HTTP协议及其实现方法;
对比网络框架,做源码分析,如ACE/ICE/ZMQ/Libevent/Muduo等
5、数据库、中间件
Mysql、redis nginx mongdb等中间件
6、集群与分布式架构
7、高性能组件造轮子的能力高并发IO
(三)Linux后台服务公司推荐
腾讯、华为云、网易游戏、小米云平台、虎牙直播、快手后台等
(四)学习项目推荐(附源码)
分布式版本控制系统:Git源码
五、逆向与反外挂
(一)逆向与反外挂就业方向
防火墙、入侵检测/入侵防御、Web应用防火墙、上网行为管理、VPN、、抗DDoS、数据库安全、数据防泄漏、漏洞扫描
(二)逆向与反外挂知识架构体系
1、 C/C++语言的逆向表现与X86汇编语言
C语言/C++逆向语法表现,内存分布,X86汇编语言、数组和指针的逆向表现、函数的逆向表现;
学习逆向如果不掌握一些汇编,基本就是盲人摸象,能出成果就只能靠运气。
随着64位机器的普及,32位程序会越来越少,这块的学习难点在于64位CPU和32位CPU差异明显,甚至可以说是差异巨大,大家学习时要注意区分。
2、 操作系统与windowsPE
操作系统进程/线程概念,互斥量、信号量、事件等;
PE头,导入/导出表;
重定位/资源/延迟加载导入表
3、 游戏反外挂/HOOK/注入
基于注入的反外挂攻防;
基于HOOK的反外挂攻防;
基于CALL的反外挂攻防;
基于窗口的外挂检测;
游戏多开的逆向分析
4、 加密/编码算法
基础的,比如异或、url编码等;
base64(出镜率极高)crc校验算法md5;
学习tea和aes des
这里建议,可以先学习正向开发的部分算法。用不同的算法处理过的数据,会有一些特征;见得多了,很多时候可以在你研究逆向时给予很大帮助。
5、 工具类
OD、CE、Windbg等调试工具;
wireshark、x64dbg、frida、visual studio,其中有一些是开发工具,比如visual studio;
虽然这些工具是开发工具,但是其中包含很多小工具,比如spy++、depends等
6、 框架
逆向框架比较多,比如Cydia、xposed、substrate、ghidra等;
每个框架所适用平台和条件也略有差异,例如:
Cydia是在苹果下做逆向;
xposed是Android下逆向;
substrate是一种拦截方案;
ghidra是一个集成环境等
7、 其他
逆向与反外挂这一部分比较特别,它们的知识点没有尽头。
除了网络协议(Http、Https、ftp、ssh)、CPU架构(arm架构、x86架构、64位架构、机器码)、操作系统(Windows、Linux、android、iOS)、驱动开发中断原理、动态库的加载和卸载,还有文件格式也需要掌握。
文件格式这块的内容也较为庞杂,简单的包括wav、bmp、apk文件格式;有了一定的了解,就可以尝试去解析pe、elf文件格式;然后还可以了解png、jpeg、jar、dex文件格式。当然,有一些没有详细文档的文件格式,比如luac、ocx,也是值得去学习和探索的。
(三)逆向与反外挂公司推荐
奇安信集团、奇虎360、深信服、启明星辰、绿盟科技、金山
扫描下方二维码
备注“计划”
即可获得推介学习项目(附源码)
领取仅限当日前50名
快来下载属于自己的学习干货库
以上是关于如何学习C++编程的主要内容,如果未能解决你的问题,请参考以下文章