目录
4. Language Evolution & Standards
6. C++ Source Files & Coding Conventions
8. Steps of Compiling a C++ Program
1. About C++
1.1 About C++
C++编程语言是一门古老的语言。它在演进中,背负了兼容C语言的重任。这也导致C++看起来什么都能干,像是一个大杂烩。
C++在软件设计开发中属于拳脚兵器的地位。它是实现软件的基本手段。学习C++之后,我们还要学习数据结构、设计模式等。之后要学习面向对象分析与设计。最后学习软件工程体系,称为一个合格的软件设计开发者。
1.2 经典C++和现代C++
C++11标准之前的C++被称为“Classic C++”,即经典C++。字C++11标准之后的C++被称为“Modern C++”即现代C++。
这个称呼的改变意味着C++从内到外有一个非常大的变化。这也是你学习本课程要达到的目的之一。
1.3 C++的编程范式
所谓编程范式,通俗来讲,就是规范编程的一系列思想、方法以及程序设计语言构造块所构成的一种模式。
C++支持多种编程范式:过程性、面向对象、泛型、函数式等
来自维基百科的定义如下:
编程范型、编程范式或程序设计法(英语:Programming paradigm),(范即模范、典范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。如:函数式编程、程序编程、面向对象编程、指令式编程等等为不同的编程范型。
编程范型提供了(同时决定了)程序员对程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。
正如软件工程中不同的群体会提倡不同的“方法学”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的(如Smalltalk和Java支持面向对象编程,而Haskell和Scheme则支持函数式编程),同时还有另一些语言支持多种范型(如Ruby、Common Lisp、Python和Oz)。
1.4 编程工具的选择
简而言之,对于学习本课程的同学来说,大部分是处于编程的初学阶段。选择编程工具,第一个因素是工具是否是最新的。
因为随着编程语言的发展,编程工具,尤其是集成开发环境也在不断进步。新的工具会提供更加友好的界面,更加易读的提示信息、编译信息。
1.5 集成开发环境
1)微软的 Visual Studio
2)开源的 Eclipse CDT + GCC
2. "C++" and its father
(C++和他爹)
2.1.1 C++ == C Plus Plus == CPP
2.1.2 Father of C++
Bjarne Stroustrup 中译:本贾尼·斯特劳斯特鲁普
读音:https://www.stroustrup.com/pronounciation.wav
2.2 The position of C/C++ in computer science (C/C++在CS的位置)
2.3 Which one is the best programming language?
2.3.1. Father of C++: Bjarne Stroustrup
There are only two kinds of programming languages: those people always bitch about and those nobody uses. (世上只有两种编程语言:一种是总是被人骂的,一种是从来没人用的。)
2.3.2. 文无第一,武无第二
2.3.3. 适用的就是最好的
2.4 Background of this class
2.4.1. Prerequisite knowledge (先导知识)
2.4.1.1. 计算机专业导论
计算机基本结构 布尔代数
2.4.1.2. C语言/Java语言
数据类型、运算符、表达式 分支、循环 函数、数组、引用、指针(C语言)
2.4.2. Follow-up learnings )
数据结构、面向对象系统分析与设计、数据库原理、计算机网络、计算机组成原理、操作系统、软件工程
3. C++ Programming Paradigm
c++编程范式
-
Structural Programming (结构化编程)
-
Object-Oriented Programming (OOP, 面向对象编程)
Advantages of OO
OOP can make programs easy to develop and easy to maintain.
面向对象编程使得开发和维护程序变得更加容易。
-
Generic Programming (GP,泛型编程)
但是,支持泛型编程的语言,能够自动处理多种类型的数据:
-
Functional Programming (FP,函数式编程)
4. Language Evolution & Standards
语言演化与标准
-
Evolution of "High Level" Programming Language (高级语言的演化)
-
C++ Standard (C++标准)
符合C++11及之后标准的C++称之为“Modern C++”,即“现代C++”。之前的C++称为“Classic C++”,即“经典C++”
Year | C++ Standard | Informal name |
---|---|---|
2020 | ISO/IEC 14882:2020 | C++20 |
2017 | ISO/IEC 14882:2017 | C++17, C++1z |
2014 | ISO/IEC 14882:2014 | C++14, C++1y |
2011 | ISO/IEC 14882:2011 | C++11, C++0x |
2003 | ISO/IEC 14882:2003 | C++03 |
1998 | ISO/IEC 14882:1998 | C++98 |
5. Programming term
我们在开发程序过程中,会用到一些与编译有关的术语,比如:【编辑器、编译器、调试器、连接器,链接器、解释器,集成开发环境(Integrated Development Environment,IDE)、图形用户界面工具】等,他们都是什么含义?
5.1 编辑器(Editor)
程序开发中的“编辑器”一般是指“代码编辑器”。一般而言,计算机程序是用文本形式体现的。少量专门用途的“编程语言”可能是用图形界面编写程序的,比如用于幼儿编程教育的 Alice 等。
代码编辑器主要用于用来编写和查看程序源代码。通常这种编辑器有语法加亮(Syntax-Highlighting)功能。
5.2 编译器(Compiler)
【中文维基百科】:编译器(compiler),是一种计算机程序,它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。
【英文维基百科】:A compiler is a computer program that transforms computer code written in one programming language (the source language) into another programming language (the target language). Compilers are a type of translator that support digital devices, primarily computers. The name compiler is primarily used for programs that translate source code from a high-level programming language to a lower level language (e.g., assembly language, object code, or machine code) to create an executable program.
5.3 链接器(Linker)
【中文维基百科】:是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件Linker 有时翻译为链接器,有时翻译为连接器。但是后者比较少见。
5.4 调试器(Debugger)
【中文维基百科】:调试器是指一种用于调试其它程序的计算机程序及工具。能够让代码在指令组模拟器(ISS)中可以检查运行状况以及选择性地运行,以便排错、调试。当开发的进度遇到瓶颈或找不出哪里有问题时,这技术将是非常有用的。但是将程序运行在调试器之下,这将比直接在运作的平台以及处理器上运行还要来得慢。
典型的调试器通常能够在程序运行时拥有以下这些功能,例如单步运行(single-stepping)、利用中断点(breakpoint)使程序遇到各种种类的事件(event)时停止(breaking)(一般用于使程序停止在想要检查的状态)、以及追踪某些变量的变化。有些调试器也有能力在想要调试的程序在运行状态时,去改变它的状态,而不仅仅只是用来观察而己。
5.5 解释器(interpreter)
【中文维基百科】:解释器是一种计算机程序,能够把高级编程语言一行一行解释运行。解释器像是一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它不会一次把整个程序翻译出来,而是每翻译一行程序就立刻运行,然后再翻译下一行,再运行,如此不停地进行下去。
5.6 集成开发环境(Integrated Development Environment,简称IDE)
【中文维基百科】:集成开发环境是一种辅助程序开发人员开发软件的应用软件,在开发工具内部就可以辅助编写源代码文本、并编译打包成为可用的程序,有些甚至可以设计图形接口。
IDE通常包括编程语言编辑器、自动构建工具、通常还包括调试器。有些IDE包含编译器/解释器,如微软的Microsoft Visual Studio,有些则不包含,如Eclipse、SharpDevelop等,这些IDE是通过调用第三方编译器来实现代码的编译工作的。有时IDE还会包含版本控制系统和一些可以设计图形用户界面的工具。许多支持面向对象的现代化IDE还包括了类别浏览器、对象查看器、对象结构图。虽然当前有一些IDE支持多种编程语言(例如Eclipse、NetBeans、Microsoft Visual Studio),但是一般而言,IDE主要还是针对特定的编程语言而量身打造(例如Visual Basic)。
5.7 图形用户界面
图形用户界面(Graphical User Interface,简称GUI)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。然而这界面若要透过在显示器的特定位置,以“各种美观、而不单调的视觉消息”提示用户“状态的改变”,势必得比简单的文字消息呈现,花上更多的计算机运算能力,计算“要改变显示器哪些光点,变成哪些颜色”
5.8 可视化程序设计语言
【英文维基百科】:In computing, a visual programming language (VPL) is any programming language that lets users create programs by manipulating program elements graphically rather than by specifying them textually. (在计算领域,可视化程序设计语言是任何能让用户以图形化的方式操纵程序元素,而不是仅仅使用编写文本的方式,来生成程序的语言)
常见的可视化程序设计语言,通常都是与集成开发环境打包的。比如 C++ 本身不是可视化程序设计语言,但是 Visual C++ 中提供了为 Windows 窗口应用程序创建界面的功能,所以以一种不严格的说法,Visual C++ 是可视化程序设计语言。
5.9 图形用户界面设计工具
我们很难听到“图形用户界面设计工具”这样的说法。
一种可能的理解是,集成开发环境为可视化程序设计语言提供的用于设计图形用户界面的功能或者工具。
另一种可能的理解是指“原型设计工具”,比如Axure等。
----------------
其它参考资料
-
关于编译器、编辑器、链接器的另一种解释: https://blog.csdn.net/ios_xumin/article/details/73457394
6. C++ Source Files & Coding Conventions
C++源文件和编码规范
-
Program Files (代码文件/程序文件)
Header file 头文件
Source file 源文件
例如:
world.h 是头文件
world.hpp 是头文件
world.cpp 是源文件
world.cxx 是源文件
-
Coding Conventions (编码规范)
2.1. Why Coding Conventions? (为何要用编码规范)
让程序具有好的可读性
“避免日后 有人(或者自己)指着你的代码骂娘:这特么谁写的破烂 玩意”(来自:知乎-Gui Wulei 。或在知乎搜索:编码规范)
2.2. Google开源项目风格指南
英文原版:https://github.com/google/styleguide
中文版:https://github.com/zh-google-styleguide/zh-google-styleguide
其中C++ 规范5 万多字,过于庞大
2.3. geosoft.no的编码风格指南(英文版)
https://geosoft.no/development/cppstyle.html
4.9 版本有94 条规则。规则相对简明
你好,世界
-
A Simple C++ Program: Aloha world!
#include <iostream>
int main() {
// 在控制台上显示 Aloha world.
std::cout << "Aloha world!" << std::endl;
return 0;
}
Header file (头文件)
Comments(注释)
std::cout / std::endl
Stream insertion operator (流插入操作符):<<
return value (返回值)
2 Coding Conventions
编码规范
\38. Special characters like TAB and page break must be avoided
\38. 不准使用“制表”和“分页”等特殊字符。 因此,在IDE中,将“制表符”设置并替换为4个空格。
\68. Functions must always have the return value explicitly listed.
\68. 函数必须总是将返回值明确列出。 若你不写返回值,编译器会默认返回int,这会让不了解此特性的程序员晕掉
-
C++ Standard Library Header Files (标准库头文件)
2.1. #include <iostream>
2.2. Standard Library Header File : iostream
cout C: stdout Java: System.out
cin C: stdin Java: System.in
7. Name Space
名字空间
namespace (命名空间/名字空间)
#include <iostream>
int main() {
// 在控制台上显示Aloha world
std::cout << "Aloha world!"
<< std::endl;
return 0;
}
有无名字空间的情况对比:
using namespact std 的害处:
#include <iostream>
using namespace std; //Don't do this!
int main() {
//Display Aloha to the console
cout << "Aloha world!" << endl;
return 0;
}
#include <iostream>
using std::cout;
using std::endl;
int main() {
//Display Aloha to the console
cout << "Aloha world!" << endl;
return 0;
}
8. Steps of Compiling a C++ Program
编译C++程序的步骤
-
Creating and Compiling Programs (创建并编译程序)
9. Dealing with Errors
处理错误
Error Classification (错误分类)
Syntax Error (语法错误) He are a boy. Runtime Error(运行时错误) He is a boy. 但是走近看发现“He”是“She” Logic Error(逻辑错误) He is a girl. 逻辑不对
Error Details (错误详解)
Syntax Error (语法错误) 违反了编程语言的语句形式或使用规则, 一般由编译器检查指出。 例如:遗漏标点符号、错用关键字、分支/循环语句结构缺失等 有时也称为“编译错误”
Runtime Error(运行时错误) 程序运行时,遇到一个无法执行的操作, 一般编译器无法检查指出。 例如:执行整数除以0的操作、打开不存在的文件、内存不足、磁盘满等
Logic Error(逻辑错误) 程序的运行结果与预期的正确结果不一致, 编译器无法检查指出。 例如:将10个整数排序输出的结果是由小到大,但是预期结果是由大到小
Common Syntax Errors (常见语法错) Wrong Keywords (写错关键字) Missing Semicolon (遗漏分号) Missing Brace/Bracket/Parenthesis (遗漏大中小括号) Missing Quotation (遗漏引号)
10. Input and Output
输入与输出
About Input and Output () Input & Output Classification ()
根据源目分类 Standard I/O (标准IO) File I/O (文件IO) String I/O (字符串IO) Network I/O (网络IO)
Input and Output in C & Java (C和Java语言中的输入输出)
Input 输入 | Output 输出 | |
---|---|---|
C | scanf() getchar() /gets() | printf() putchar() / puts() |
Java | Scanner类 … | System.out.println() / print() /printf() / …… … |
C++ Input & Output (C++) C++ uses to perform input and output in media such as the screen, the keyboard or a file.
(C++使用一种叫做“流”的概念对屏幕、键盘或者文件进行输入输出操作)
Stream(流) | Description(描述) |
---|---|
cin | standard input stream 标准输入流 |
cout | standard output stream 标准输出流 |
cerr | standard error (output) stream |
clog | standard logging (output) stream |
C++ IO Operators and Functions (C++输入输出操作符和函数)
Stream(流) | Operators (操作符) | Functions (函数) |
---|---|---|
cin | >> 含义: extraction operator (流提取运算符) | cin.get() 从流中读并取走一个字符 cin.getline() 从流中读取字符,直至行尾或指定的分隔符 cin.ignore() 从流中读取并舍弃指定数量的字符 |
cout | << 含义: insertion operator (流插入运算符) | cout.put() 将字符写到流中(无格式) cout.flush() 将流中缓存内容全部输出 |