[2017.02.04] C++学习记录(1)
编编程语言的目的是帮助程序员以代码的形式表述ideas。编程语言一方面为程序员提供一组关于可以做什么的抽象,另一方面为程序员提供可以被机器执行的轮子。C++编程语言,支持4种编程范式:过程式(Procedural Programming,主要集中在过程和合适的数据结构)、数据抽象(Data abstraction,主要表现为设计抽象接口隐藏具体实现细节)、面向对象编程(Object-oriented programming,主要集中在设计、实现和使用类继承结构,提供运行时多态性)和泛型编程(Generic programming,主要集中在设计、实现和使用泛型算法,提供编译时多态性)。
C++广泛应用于教学和科学研究,虽然不是“最好”的语言,但是它是一门可以伴随着成长的语言,有如下特点:
Sufficiently clean for successfully teaching basic design and programming concepts
Sufficiently comprehensive to be a vehicle for teaching advanced concepts and techniques
Sufficiently realistic, efficient, and flexible for demanding projects
Sufficiently commercial to be a vehicle for putting what is learned into nonacademic use
Sufficiently available for organizations and collaborations relying on diverse development and execution environments
在学习C++的时候,一是要关注基本概念(fundamental concepts),如类型安全(type safety)、资源管理(resource management)和不变量(invariants)等;二是要学习一些编程技术,如资源管理的实现、算法中的迭代器的使用、设计模式(可复用面向对象软件的基础)等。切记沉浸在语言的细节中。学习语言的目的是为了更加高效设计和实现新的系统并维护旧的工程。因此评判鉴定不同的语言和设计技术,比理解所有的细节更加重要。细节的熟练掌握需要时间的沉淀和实践打磨。
C++语言有几个不同独立版本的实现,如Microsoft自家在VisualStudio中的实现,GNU的MinGW实现等。每种版本都有自己对C++标准的解释和一些偏见,所有学习的时候,多多综合参考各自的manuals、online resources等,以期达到更加全面的理解。
学好一门编程语言,就如同学会写作一样。需要我们知道自己想要说什么(Know what you want to say)并且多加练习和模仿名家作品(Practice and imitate good writing)。大道至简却也知易行难。
一些C++学习和使用建议:
- C++不仅仅是C的超集。C++虽然可以像C那样使用,但是在维护和性能上属于这是未达到标准的行为。为了真正发挥C++优势,我们需要采用不同的设计和实现风格(implementation styles)。C++提供了有用的语言特性,就不必再使用C的风格(如字符串赋值时使用 = 而不是strcpy(),字符串比较时使用==而不是strcmp())。
- C++中尽量少用宏替换(macro substitution),虽然宏替换减少了工作量,但是不利于静态类型检查,不便于调试和维护。可以使用const/constexpr/enum/enum class来定义常量(manifest constants),使用inline减少函数调用的开销,使用templates来定义相似的函数和类型,使用namespace避免名称冲突。
- 不要使用原生的malloc/free,使用new/delete结合智能指针unique_ptr/shared_ptr/weak_ptr等实现内存管理;使用vector等类库替换realloc等操作。
- 避免隐式类型转换,使用显式的有名转换(explicit named casts),如使用static_cast运算符。
- 使用容器和算法,不要认为辛苦地编写C风格的代码就比使用STL库更加有效率,通常吃力不讨好。
- 使用constructor/destructor pairs 简化资源管理操作,常使用RAII技术。
- 尽量使用久经考验的标准库设施而不是个人开发的代码,以增强代码复用性和可维护性。
- 当错误不能够被局部代码处理时,使用exception而不是error。
- 使用移动语义(move sematics)避免大对象的值拷贝。
- 使用智能指针代替原生指针,不要混用智能指针和原生指针。
- 使用模板维护静态类型安全检查和实现编译时多态。
- 不要过度抽象(overabstract),避免使用不必要的类继承。
- 使用局部变量,避免使用全局变量,最小化指针的使用场合。
- Keep simple things simple (without making complex things impossible).
C++的history/timeline/language features/library facilities。
经过几十年发展,C++的语言标准也在不停的进化,我们想要做一个合格的码农,也需要跟上语言标准的步伐。学习新技术不是为了学习而学习,而是为了使用新技术解决了过往技术的痛点。如今C++11已经提出了五六年了,新版本C++14/17也近在眼前,如果我们还仅仅停留在C++98而对新技术无动于衷,未免有点故步自封了。学习和使用新版本中的语法特性,使得设计和编程时更加现代化。
C++11的目标:
- Make C++ a better language for systems programming and library building.
- Make C++ easier to teach and learn.
C++11 的 new features:
- Control of defaults: =delete and =default.
- Deducing the type of an object from its initializer, auto.
- Generalized constant expression evaluation (including literal types), constexpr.
- In-class member initializers.
- Inheriting constructors.
- Lambda expressions, a way of implicitly defining function objects at the point of their use in an expression.
- Move semantics, a way of transmitting information without copying.
- A way of stating that a function may not throw exceptions noexcept.
- A proper name for the null pointer.
- The range-for statement.
- Override controls: final and override.
- Type aliases, a mechanism for providing an alias for a type or a template. In particular, a way of defining a template by binding some arguments of another template.
- Typed and scoped enumerations: enum class.
- Universal and uniform initialization (including arbitrary-length initializer lists and protection against narrowing).
- Variadic templates, a mechanism for passing an arbitrary number of arguments of arbitrary types to a template.
...
C++11的library facilities
- Hashed containers, such as unordered_map.
- The basic concurrency library components, such as thread, mutex, and lock.
- Launching asynchronous computation and returning results, future, promise, and async().
- The garbage collection interface.
- A regular expression library, regexp.
- A random number library.
- A pointer for simply and efficiently passing resources, unique_ptr.
- A pointer for representing shared ownership, shared_ptr.
- The tuple library.
- The general bind().
- The function type for holding callable objects.
学习C/C++的书单列表
- The C Programming Language
- The C++ Programming Language
- C++ Primer
- Computer Systems: A Programmer's Perspective
- Code Complete
- Design Patterns:Elements of reusable object-orientd- software
- Python源码剖析
- STL源码剖析
- 冒号课堂
- Algorithms
- Compilers:Principle,Techniques and Tools
C/C++编程入门和进阶项目
- 字符串类
- 多线程编程:多线程IO环形队列缓冲大文件英文单词词频统计
- 多线程编程:消息传递同步操作的多线程银行ATM模拟
- LevelDB源码阅读
- Python源码剖析
- STL源码剖析
- Redis源码阅读
面向对象编程和设计(Object oriented programming and design)的SOLID原则:
S:SRP,single responsibility principle,单一职责原则。一个类应该只有一个职责。
O:OCP,Open/Closed principle,开闭原则。一个软件实体(类、模块、函数等)应该对拓展开放,对修改关闭。这样可以不修改实体的源码而直接拓展它的行为。
L:LSP,Liskov substitution principle,里氏替换原则。 基类可以被子类替换而不产生类型错误。
I:ISP,Interface segregation principle,接口隔离原则。 多个特例化的接口优于一个通用的接口。对软件进行解耦合,便于后期重构和维护。
D:DIP,Dependency inversion principle,依赖倒转原则。高层模块不应爱依赖于底层模块,它们都应该依赖于抽象。抽象不依赖于细节,细节依赖于抽象。
[2017.02.04] C++学习记录(1)的更多相关文章
- 前端学习记录之Javascript-DOM
简介 为了快捷方便,在工作和项目中,一直都是使用的框架,比如jqeruy,vuejs,react等.然后在长时间使用框架后,往往有一个后遗症,就是对于原生的Javascript基本上已经不知道怎么写了 ...
- 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)
目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...
- 02 | 日志系统:一条SQL更新语句是如何执行的? 学习记录
<MySQL实战45讲>02 | 日志系统:一条SQL更新语句是如何执行的? 学习记录http://naotu.baidu.com/file/ad320c7a0e031c2d6db7b5a ...
- Python学习记录day6
title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...
- GIT初始学习记录
目录 GIT学习记录 配置github与gitlib两个账号 基本操作 git init:初始化仓库 git status:查看仓库状态 git add :向缓存区中添加文件 git commit 保 ...
- Python全栈工程师系列学习之学习记录
@ 目录 前言 Day 01 一.python的历史和种类 二.安装python解释器以及配置环境变量 三.变量.常量和注释 Day 02 Day 03 Day 04 Day 05 Day 06 一. ...
- [2017.02.21] 《Haskell趣学指南 —— Learning You a Haskell for Great Good!》
{- 2017.02.21 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> [官网](http://learnyouahas ...
- java开源项目之IQQ学习记录之项目环境搭建与启动
本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/18779727 作者:sushengmiyan 现在就码字说说今天晚上搞定的一个项目 ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
随机推荐
- 省市区三级联动插件:app-jquery-cityselect.js
(function ($) { $.fn.cityselect = function (options) { var settings = $.extend ({}, options); this.e ...
- 将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)
- (NSArray *)testa:(NSDictionary *)dic { NSMutableArray *arr_M = [NSMutableArray array]; // 1.遍历每一个元 ...
- javascript books
脑子里突然冒出这么一句话: “反射 是一种 代理!!!”,javascript ECMScript 6中也开始实现 Reflect 了. php的动态代理, 反射方面,在很多框架中都用到了.也是很多框 ...
- zookeoper在root下设置开机启动
1 准备工作 1) 切换到/etc/rc.d/init.d/目录下 2) 创建zookeeper文件:touch zookeeper 3)更新权限:chmod +777 zookeeper 4)编辑文 ...
- Activiti----hellowWorld(使用H2数据库)
1.项目结构 2.pom <dependencies> <dependency> <groupId>junit</groupId> <artifa ...
- php中使用mysql_fetch_array输出数组至页面中展示
用的是CI框架,很好的MVC结构 在Model层 public function showProteinCategory(){ $sql = "SELECT DISTINCT protein ...
- PHP 判断几秒前,几分钟,几小时前
PHP 对于时间的过了多久的判断,几秒前,几分钟前,几小时前,$time = strtotime("2017-01-15 14:42:00"); $time = strtotime ...
- SocketChannel
Java NIO 中的 SocketChannel 是一个连接到 TCP 网络套接字的通道.可以通过以下 2 种方式创建 SocketChannel: 打开一个 SocketChannel 并连接到互 ...
- 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)
源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /***************************************** ...
- IOS第三方数据库--FMDB 分类: ios技术 2015-03-01 09:38 57人阅读 评论(0) 收藏
iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...