第1章 C++概述

欢迎来到C++世界!
1.1 C++起源
20世纪70年代,贝尔实验室的研究员D.M.Ritchie开发了C语言。与C语言一样,C++也是在贝尔实验室诞生的,20世纪80年代,Bjarne Stroustrup在C语言的基础上开发了C++语言,1985年,Bjarne博士完成了经典著作《The C++ Programming Language》第1版。
1.2 编程思想
编程思想中的思想指的是思考问题的方式,C++容纳三种编程思想:面向过程、面向对象、泛型。
1.2.1 面向过程和面向对象
面向过程,简称POP(Procedure Oriented Programming),核心是事物发展的过程或解决问题的步骤,思考事物发展过程的先后顺序,先怎么样后怎么样,思考解决问题的步骤,先做什么后做什么。
面向对象,简称OOP(Object Oriented Programming),核心是事物本身,思考事物所具有的属性、事物所具有的行为。
那么,面向过程和面向对象有什么区别呢?让我们用面向过程和面向对象两种不同的方式来思考下面问题:
问题:学生是什么?
当我们在思考,学生是什么?首先我们会想到,学生是一个人,是什么样的人呢?
情景1:面向过程。我们会思考学生从早到晚按顺序依次做哪些事情,我们会想到学生是这样的人:早上醒来之后先穿衣服起床,再去洗脸刷牙,然后吃早餐,去上课,然后下课去吃午饭,下午或许会没有课,学生就有了多种选择,可能会去图书馆读书丰富自己的知识,也可能会去跟热恋的人约会一起度过美好的学校时光,当然,还可能在准备一场重要的考试……
即:
学生
起床->洗刷->吃早餐->上课->下课吃午餐->图书馆读书OR与恋人约会OR准备考试OR……
可以看出这种思考方式关注的是过程,学生一件事接一件事地先做什么,后做什么,再做什么…
情景2:面向对象。我们思考的核心自然是学生本身,我们会想:学生是什么?学习者?参加研究的人?残酷社会现实的避难者?还是有姓名和一系列考试分数的人?显然,最后一个定义完全没有表现出人的特征,但非常适合于简单地区分开每一个学生并且这也是现实中普遍采用的一种定义方式。接着,我们还会想到,学生会做一些事情,穿衣起床、洗脸刷牙、吃早餐、上课、吃午饭、到图书馆读书、与热恋的人约会、参加考试……因此,我们经过思考,给出了这样答案:学生是有姓名和一系列考试分数的人,学生会一些事情,穿衣起床、洗脸刷牙、吃早餐、上课、吃午饭、到图书馆读书、与热恋的人约会、参加考试……
即:
学生
属性:有姓名和一系列考试分数的人
行为:穿衣起床、洗脸刷牙、吃早餐、上课、吃午饭、到图书馆读书、与热恋的人约会、参加考试……
可以看出这种思考方式关注的是学生本身,学生的属性是什么?学生有哪些行为?
1.2.2泛型
泛型(Generic Programming)即在一定范围内通用,不针对特定的类型。泛型很容易理解,一起来看一个具体的例子:当你结婚的时候向亲朋好友发出请帖,请帖上的话虽然很简短但表达了你盛情真诚地邀请他们参加你的婚礼。细心的人可能会发现在你发出的请帖上,都写着同样的盛情真诚的话,根据所要邀请的人,你在相同的请帖上写下了不同的名字。这说明:虽然需要邀请的人很多,但只需要一种请帖就够了。当你在组织这段盛情真诚的话语的时候也可以说是在设计一种泛型。
至此,你已经初步了解了C++的三种编程思想,在后面的章节中还会进行更深的讨论。
1.3 程序创建过程
源代码->编译器->目标代码->链接程序(启动代码、库代码)->可执行代码
本书余下的篇幅讨论编写源代码,示例代码程序可在Windows平台下的Visual Studio 2010编译器运行,在创建程序时选择控制台程序,创建空项目,输入代码之后你可以按Ctrl+F5调试运行,或者,也可以按只按F5或点击调试按钮但要稍微麻烦一些,运行窗口会一闪而过,难以查看输出,为此需要在程序最后加入一些代码:
cin.get();
cin.get();
return 0;
}
上述代码意味着程序等待你按下Enter键之后关闭。
Visual Studio 2010是Windows平台下一款功能强大的编译器,在此不做过多介绍。
1.4 C++关键字
关键字是C++语言的词汇,借助这些关键字,您可以把自己想法以C++程序代码的形式表达出来,当然您也可以给自己写的代码作注释,帮助其他阅读代码的人理解您想要表达的想法。总之,应牢记这些关键字,后面的章节中随着学习的不断深入,将介绍每一个关键字的用法和作用。不论是在现在的学习中还是以后的开发中,这些关键字会始终伴随着您。一起来看一下这些关键字:
alignas alignof asm auto bool

break case catch char char16_t

char32_t class const const_cast constexpr

continue decltype default delete(实际为运算符) do

double dynamic_cast else enum explicit

export extern flase float for

friend goto if inline int

long mutable namespace new(实际为运算符) noexcept

nullptr operator private protected public

register reinterpret_cast return shot signed

sizeof static static_assert static_cast struct

switch templete this thread_local throw

true try typedef typeid typrname

union unsigned using virtual void

volatile wchar_t while

为了让您更好地理解这些关键字,下面对关键字的英文原义和在c++中的意义分别进行了简单的解释。

alignas(align as) 设置对齐要求 align(对齐)
alignof(align of) 查询其运算数类型的对齐要求
asm(assembly language) 汇编语言指令
auto(automatic) 自动变量、自动推断类型 automatic(自动的)
bool(George Boole) 逻辑型变量的定义符 George Boole(英国数学家、布尔代数的奠基人乔治·布尔)
break(break) 跳出循环 break(打断)
case(case) 标签 case(具体情况)
catch(catch) catch异常处理语句 catch(捕获)
char(character) 字符 character(字符)
char16_t(character 16_bit) 16位字符类型 bit(位, binary digit的缩写)
char32_t(character 32_bit) 32位字符类型
class(class) 类 class(类别,种类)
const(constant) 常量 constant(固定不变的)
const_cast(constant cast) const_cast强制类型转换 cast(抛,投)
constexpr(constant expression) 常量表达式 expression(表达)
continue(continue) 跳过本轮循环,直接进入下一轮循环 continue(继续)
decltype(declare type) 将变量类型声明为表达式类型 declare(声明)type(类型)
default(default) 备选默认值 default(默认,违约,预设值)
delete(delete) 释放内存 delete(删除)
do(do) do while循环语句
double(double float) 双精度浮点数 double(双倍) float(浮点数)
dynamic_cast(dynamic cast)dynamic_cast强制类型转换 dynamic(动态的)
else(else) 分支判断语句 else(其他的)
enum(enumerate) 枚举 enumerate(枚举,列举)
explicit(explicit) 显式调用限制 explicit(明显的)
export(export) 使用外部模板 export(外部的)
extern(extern) 使用外部变量 extern(外部的)
flase(flase) 逻辑bool值0 flase(错误)
float(float) 浮点数,即小数 float(浮点数,浮动的)
for(for) for循环语句
friend(friend) 友元 friend(友人)
goto(go to) 跳转语句
if(if) 判断语句 if(如果,是否)
inline(inline) 内联函数 inline(内联的)
int(integer) 整数类型 integer(整数)
long(long integer) 大型整数 long(长和)
mutable(mutable) 易变变量,与const常量相反 mutable(易变的,可变的)
namespace(name space) 名称空间 name(名称) space(空间)
new(new) 请求分配内存 new(新的,新建)
noexcept(no exception) 保证函数不会发出异常 no(没) exception(异常,例外)
nullptr(null pointer) 空指针 null(空的) pointer(指针)
operator(operator) 运算符重载 operator(操作者)
private(private) 私有访问限制 private(私有的)
protected(protected) 保护访问限制 protected(受保护的)
public(public) 公有访问 public(公有的,公开的)
register(register) 寄存器变量 register(登记,注册,寄存器)
reinterpret_cast(re-interpret) reinterpret_cast强制类型转换 re-interpret(重新解释)
return(return) 返回函数值 return(返回)
short(short integer) 简单整数类型 short(简短的)
signed(signed integer) 有符号整数 signed(有符号的)
sizeof(size of) 获取存储类型大小 size(规格,型号)
static(static) 静态变量 static(静态的)
static_assert(static assert) 静态断言 assert(断言)
static_cast(static)static_cast强制类型转换
struct(structure) 结构体 structure(结构,构造)
switch(switch) 选择判断语句 switch(开关,转换)
templete(templete) 模板 templete(模板)
this(this) 指向类自身的指针 this(这个)
thread_local(thread local) 线程变量 thread(线程)local(本地的)
throw(throw) throw异常处理语句 throw(抛向,扔向)
true(true) bool逻辑值1 true(正确)
try(try) try异常处理语句 try(尝试)
typedef(type define) define(定义)
typeid(type id) 指针类型标识 id(标识,Identity document的缩写)
typename(type name) 模板泛型标识
union(union) 共用体 union(联合)
unsigned(unsigned integer) 无符号整数 unsigned(没有符号的)
using(using) 名称空间编译指令 using(使用)
virtual(virtual) 虚方法、虚基类 virtual(虚拟的)
void(void) 空类型 void(空的)
volatile(volatile) 易变变量,与const固定变量相对 volatile(易变的)
wchar_t(wide character bit) 宽字符类型 wide(宽的)
while(while) while循环 while(当)

您只需要粗略看一遍,不必要求立即记住。在后面的章节中,您会经常见到这些关键字,在读完这本书之后,您对他们将不再感到陌生,而是变得非常熟悉。

1.5 C++符号
前面说过,我们以C++代码的形式表达自己的想法需要借助关键字,细心的你可能已经察觉到,C++的关键字相比于人类庞大的语言系统还不足以完整地表达我们的想法,所以还需要借助一些C++符号,一起来看一下这些符号:

±*/ % =

( ) { } [ ] < >

, . ; : " " ‘’ ?

\ & | ! ~ ^

需要注意:
同一符号在不同的情况下会有不同含义,比如,-5中的-号表示负号而在2-1中-表示减号。有些符号之间可以相互组合形成新符号,比如,小于号< 与大于号> 组合在一起成为尖括号 < > 。一个符号可以通过自身加倍形新符号,比如,++、<< 。同样,这些通过组合或者自身加倍形成的新符号在不同的情况下也会有不同的含义。当然,这些符号除了可以被当作表示特殊含义的符号使用之外,也可以当作普通符号用于输入和输出。
对于这些符号C++给出了普遍情况下的通用定义,同时C++遵循自由原则,您可以根据自己的愿望给符号(包括组合或者自身加倍形成的新符号)添加新的定义使他们在特定的情况下具有特定含义或者使用您添加的新定义而不是原来的通用定义。比如,1和2作比较通常被认为是有意义的,即:2>1的逻辑结果是正确,2>1表示2比1大;而网络名人和C++开发人员作比较通被认为是没有意义的,因为这是两个完全不同的群体,然而,您对那些固执地追求知识和技术、创新和卓越,在浮躁的世界里通过coding以实际行动默默改变世界的C++开发者们有些许的偏爱,于是您给大于号> 添加了新的定义:C++开发人员>网络名人的逻辑结果是正确,C++开发人员>网络名人表示与网络名人相比您更偏爱C++开发人员。至于如何添加新定义在后面的章节中会做详细的阐述,添加了新的定义之后,您的程序在计算 C++开发人员>网络名人 的逻辑结果的时候,会根据您给出的定义,得到逻辑结果:正确。这虽然与逻辑事实不相符,但应该想到:容忍逻辑上无法圆其说的观点,正是人类思维的特点。
还有一些符号通常被用作命名或输入输出,在程序中不起特殊作用,也不能用于添加新定义。常见的有以下符号:@ $ ` _

1.6 C++字母字符 数字 数字字符
1.6.1 字母字符
C++字母字符分为大写字母字符 A—Z,小写字母字符a—b。这说明C++区分字母大小写。
1.6.2 数字 数字字符
C++数字和数字字符是两个不同的概念。数字1表示1是一个数字并且能进行一些数字运算,而数字字符1仅仅表示1这个符号。

1.7 ASCII字符集
在计算机内部,对于西文字符的表示,采用ASCII码(American Standard Code for Information Interchange,美国国家信息交换标准字符码)进行表示。ASCII字符集共128个字符(10+26+26+34+32=128)0-9的十个数字、a-z和A-Z的五十二个大小写字母、34个专用特殊符号和32个用于控制的符号,其中除了控制符号外,其余的96个字符都是可以打印的。其中:
0~31及127(共33个)是控制字符,如:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等。
32~126(共95个)是字符(32是空格),48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。在C++中与计算机内部的表示方式一样,以字符对应的ASCII码作为字符的值。
可以看出,无论是符号还字母、数字其储存方式都是ASCII码的形式,并且大写字母和小写字母各自的值不同,数字字符0的值是48而不是0。

2020-09-16相关推荐

  1. RDKit | 基于RDKit(≥2020.09.1)的相似图绘制新方法

    导入库 from rdkit import Chem from rdkit.Chem import Draw from rdkit.Chem.Draw import SimilarityMaps fr ...

  2. 微型计算机2020年6月上,2020年1-6月全国微型计算机设备产量统计分析

    [中国报告大厅讯]根据中国报告大厅对2020年1-6月全国微型计算机设备产量进行监测统计显示:2020年6月全国微型计算机设备产量3216.5万台,同比增长0.3%,2020年1-6月全国微型计算机设 ...

  3. 太吾绘卷第一世攻略_建平中学高二数学周练卷(2020.09)

    试卷图片仅供学习交流使用,答案仅供参考 [往期内容] 高一是坎, 高二是坡, 高三是峰! 最全学习攻略 新高一数学教材必修第一册第一章习题答案 往年高中9月开学考月考数学试卷汇总 2020上海高考复交 ...

  4. [Android] 迅游加速器 5.1.26.1免费版 2020.6.16更新

    [Android] 迅游加速器 5.1.26.1免费版 2020.6.16更新 蓝奏云下载链接 求关注持续跟新

  5. 计算机系统招标范围,信息化系统招标文件(2015.09.16最终稿1).doc

    信息化系统招标文件(2015.09.16最终稿1) 鸡西市.七台河市供水(干线)工程 联合调度与运行管理决策支持系统 招标设计 技术规范 水利水电勘测设计研究院 二○一五年九月 目 录 1 工程概况1 ...

  6. Visual.Assist.X.10.9.Build.2375.0 2020.05.16 最新版

    Visual.Assist.X.10.9.Build.2375.0 2020.05.16 最新版,带特殊文件,解压后查看使用说明. VC++编程助手,支持VS 2019,亲测可用. 共享备用. 7zi ...

  7. 多益网络校招前端面经(2020.09.24)

    多益网络校招前端面经(2020.09.24) 面试平台 QQ视频通话 时长 大约半小时 过程 自我介绍 项目问题:项目中遇到的问题以及解决方式:在团队开发过程中个成员合作方式,遇到问题的解决方式 cs ...

  8. [汉化主题] Knowhow v1.1.20 – 响应式论坛知识库WordPress主题 (2020.09.20更新)

    KnowHow诈尸更新了.作者在2018年更新了v1.1.16版本就停更了,没想到啊2年后的2020年突然又更新了,而且一连更新了四个版本. 今天我直接为你们带来最新版的汉化主题,Knowhow v1 ...

  9. 谈谈mini2440开发板的学习路线以及分享开发板的最新资料[minitools v1.9a...](更新时间:2020/05/16))

    谈谈mini2440开发板的入门学习路线以及分享开发板的最新资料[minitools v1.9a...](更新时间:2020/05/16) 简介 因为毕设,自己也在学习mini2440开发板,但是它实 ...

  10. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

最新文章

  1. [原]《Web前端开发修炼之道》-读书笔记CSS部分
  2. 一文带你学会国产加密算法SM4的vue实现方案
  3. 基于MATLAB的dijkstra算法及其应用
  4. java jaspersoft,Jaspersoft Studio
  5. 【力扣面试】面试题 04.02. 最小高度树(就是创建二叉平衡树)
  6. 大数据应用的典型案例
  7. spark scala求PV,UV,topN
  8. html css图片展开动画,9种CSS3炫酷图片预览展示动画特效
  9. 用Asp.net 就能轻松实现铁道部的订票系统
  10. 产品如何取得WFA的WiFi认证(二)成为WFA会员
  11. 月薪9K程序员,写完这段代码就被辞退了
  12. centos8重启网卡服务
  13. 关于bitset中的 to_ulong()的解答
  14. Java参数变量_Java变量参数
  15. Docker容器化技术笔记
  16. 编译原理——语法制导翻译并产生中间代码(布尔表达式和控制语句)
  17. 常见3大类放电管的区别与特性
  18. Python3安装完全攻略 Mac篇
  19. does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Up
  20. libra区块链技术白皮书-中文部分翻译版

热门文章

  1. 2011-2012中国嵌入式开发从业人员调查报告
  2. 零宽字符隐写——2021网刃杯CTF 签到
  3. [附源码]SSM计算机毕业设计公务员报名JAVA
  4. 大一下期末javaGUI课设之swing+MYSQL实现“弹珠传说”弹球小游戏
  5. 基于算力网络的大数据计算资源智能调度分配方法
  6. 信息奥赛c语言是什么意思,信息学竞赛是什么?信息学竞赛学什么,有什么作用?...
  7. 魔兽争霸触发器Trigger解析
  8. 赛孚耐SafeNet开发狗超级狗程序外壳加密
  9. 卸载重装Android Studio导入先前的版本,或者是误判SDK installed解决方法。(包含window,mac,Linux)
  10. 以下不是html5新特性的是,Html5的一些新特性