第二章 对象的创建与使用

2.1语言的翻译过程

翻译器分为两类:解释器(interpreter)和编译器(compiler)。

2.1.1解释器

解释器将源代码转化成一些动作(它可由许多机器指令组成)并立即执行这些动作。

解释器必须驻留内存以执行程序。

2.1.2编译器

编译器直接把源代码转化成汇编语言或机器指令。

分段编译(separate compilation):某些语言(如C语言)可以分别编译各段程序,最后使用连接器(linker)把各段程序连接成一个完整的可执行程序。

人们把测试通过并能正常运行的程序块收集起来加入库(library)中,供其它程序员使用。

源代码层的调试器(source-level debugger):通过跟踪程序经过源代码的进展来显示程序的执行情况。

2.1.3编译过程

C/C++编译时首先要对源代码执行预处理。预处理器(preprocessor)是一个简单的程序,它用程序员定义好的模式代替源代码中的模式。预处理过的代码通常放在一个中间文件中。

编译分两遍进行。首先对预处理过的代码进行语法分析。编译器把源代码分解成小的单元并把它们按树形结构组织起来——语法分析树。

使用全局优化器(global optimizer)来生成更短、更快的代码。

编译的第二遍,由代码生成器(code generator)遍历语法分析树,把树的每个结点转化成汇编语言或机器代码。最后生成目标模块(.o或.obj文件)

使用窥孔优化器(peephole optimizer)从相邻代码中查找冗余汇编语句。

连接器(linker) 把一组目标模块连接成一个可执行程序,操作系统可以装载和运行它。当某一目标模块中的函数要引用另一目标模块中的函数或变量时,由连接器来处理这些引用,连机器还要添加一个特殊的目标模块来完成程序启动任务。

连接器能搜索称为”库“的特殊文件来处理所有的引用。库将一组目标模块包含在一个文件中。

2.2.3.1静态类型检查(static type checking)动态类型检查(dynamic type checking)

类型检查(type checking)是编译器在第一遍中完成的。

2.2分段编译工具

程序分割的最基本的方法是创建命名子程序。C/C++里子程序成为函数(function),函数是一段代码段,可以将这些函数放在不同的文件中,并能分别编译。

声明(declaration):“告知编译器”外部函数和数据的名称及它们的模样。“声明”是向编译器介绍名字——标示符。它告诉编译器这个函数或这个变量在某处可找到,它的模样像什么。而“定义”是说:“在这里建立变量或在这里建立函数”,它为名字分配存储空间。

单一定义规则(one-definition rule):C/C++可以在不同的地方吗相同的变量和函数,但只能有一个定义。

2.2.1.1函数声明的语法

在函数声明时,可以给出参数命,编译器会忽略这些参数命名。

extern关键字:它表示变量是在文件以外定义的,或在文件后面部分才定义。

2.2.1.5包含头文件

大部分库包含众多的函数和变量,为了减少工作量,确保一致性,当对这些函数变量做外部声明时,C/C++使用“头文件”(header file)。头文件是一个包含某个库的外部声明函数和变量的文件。

包含头文件,要使用#include预处理命令,他告诉预处理器打开指定的头文件并在#include语句所在的地方插入头文件。#include有两种方式:

(a)尖括号指定头文件:预处理器以特定的方式寻找文件,一般是环境中或编译器命令行指定的某种寻找路径。

(b)双引号指定头文件:预处理器以“由实现定义的方式”来寻找文件,从当前目录开始寻找,如果文件没有找到就与按尖括号同样的方式重新寻找。

2.2.1.6标准C++ include语句格式

标准使用的格式允许文件名长度可以大于8个字符,去除了扩展名。

使用.h头文件是老的、非模板化的版本,而没有.h的文件是新的模板化版本。

2.2.2连接

连接器把由编译器生成的目标模块(.o或.obj文件)连接成为操作系统可以加载和执行的程序。

2.2.3使用库文件

连接器建立目标模块列表,把标示符加到“未解析的引用”列表中。如果遇到过函数或变量的定义,那么这就是已解决的引用,否则去查找库,把库中包含所需定义的模块加入连接。

因为连接器按指定的顺序查找文件,用户使用与库函数同名的函数,被使用的是用户的函数而不是库函数,这可能是一个bug,C++名字空间禁止这样做。

2.2.3.2秘密的附加模块

当创建一个可执行程序时,连接器会秘密连接某些模块。其中之一是启动模块,它包含了对程序的初始化例程,初始化例程建立堆栈,并初始化程序中的某些变量。

连接器总是从标准库中查找程序中调用的经过编译的“标准”函数。标准库总可以被找到,只要程序中包含所需头文件就可以使用库中的任何模块,不要告诉连接器去找标准库,如果使用附加的库,必须把该库文件名添加到由连接器处理的列表文件中。

2.3.2名字空间

namespace关键字:当程序达到一定规模后,函数名和标示符不够用,预防这种冲突的机制。

using关键字:如果只包含头文件,编译器无法找到任何有关函数和对象的声明,要告诉编译器所使用的名字空间。

对已经存在的代码提供向后兼容:#include<iostream.h> 相当于 #include<iostream>   using namespace std;

2.3.3程序的基本结构

C的注释行以 “ /* ”开始,以“ */ ”结束,其中可以包含换行符。

C++注释符“ // ”,注释从“ // ”开始,到换行符结束。

2.4.1字符数组的拼接

如果两个加引号的字符数组邻接,并且它们之间没有标点,编译器就会 把这些字符数组连接成单个字符数组。

2.5字符串简介

可以用“=”给string对象赋值

连接string对象用“+”操作符

将string加到一个string之后用“+=”操作符

2.6文件的读写

头文件<fstream>,且自动包含<iostream>

创建一个ifstream对象或ofstream对象

getline()函数,第一个参数是ifstream对象,第二个参数是string对象。getline()将丢弃掉换行符。

//Copy one file to another,a line at a time
#include<string>
#include<fstream>
using namespace std; int main()
{
ifstream in("Scopy.cpp");
ofstream out("Scopy2.cpp");
string s;
while(getline(in,s))
out<< s <<"\n";
}

2.7 vector简介

在vector后追加一个新元素,可以使用成员函数push_back()

元素可以由下标(indexing)选定

//Creating a vector that holds inergers
#include<iostream>
#include<vector>
using namespce std; int main()
{
vector<int> v;
for(int i=;i<v.size();i++)
v.push_back(i);
for(int i=;i<v.size();i++)
cout<<v[i]<<",";
cout<<endl;
for(int i=;i<v.size();i++)
v[i]=v[i]*; //Assignment
for(int i=;i<v.size();i++)
cout<<v[i]<<",";
cout<<endl;
}

《Thinking in C++》学习笔记(一)【第二章】的更多相关文章

  1. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...

  3. 流畅的python学习笔记:第二章

    第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...

  4. Python 3.5学习笔记(第二章)

    本章内容 1.模块 2.数据类型与数据运算 3.进制 4.byte 与 string 的互相转换 5.列表 6.元组 7.字符串操作 8.字典 一.模块 Python 把某些常用的定义存放在文件中,为 ...

  5. Python基础教程学习笔记:第二章 列表和元组

    1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串 ...

  6. STL学习笔记(第二章 C++及其标准程序库简介)

    本章重点是介绍与C++标准程序库相关的几个最重要的语言新特性 template(模板) 程序库中几乎所有东西都被设计成template形式.所谓templates,是针对“一个或多个尚未明确的型别”所 ...

  7. UNP学习笔记(第二章:传输层)

    本章的焦点是传输层,包括TCP.UDP和SCTP. 绝大多数客户/服务器网络应用使用TCP或UDP.SCTP是一个较新的协议. UDP是一个简单的.不可靠的数据报协议.而TCP是一个复杂.可靠的字节流 ...

  8. JavaScript DOM编程艺术-学习笔记(第二章)

    1.好习惯从末尾加分号:开始 2.js区分大小写 3.程序界万能的命名法则:①不以,数字开头的数字.字母.下划线.美元符号 ②提倡以下划线命名法来命名变量,以驼峰命名法来命名函数.但是到了公司往往会身 ...

  9. ArcGIS API for JavaScript 4.2学习笔记[4] 第二章其余感兴趣的例子

    先马克,估计要用到的有: 视图存档 2D地图添加指南针 视图移动 鹰眼 2D3D视图同步.同视图不同数据同步 以后实战的时候再仔细研究研究.

  10. 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)

    一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...

随机推荐

  1. sqlserver中查找长时间未提交事务

    无论是有意无意,如果事务在数据库中保持打开,则它会阻塞其他进程对修改后的数据进行操作.同样,对事务日志进行备份也只会截断不活动事务的那部分事务日志,所以打开的事务会导致日志变多(甚至达到物理限制),直 ...

  2. Javascript中“==”与“===”的区别

    在Javascript中有"=="和"==="两种比较运行符,那么他们有什么区别呢? 一.对于string,number等基础类型,==和===是有区别的 1) ...

  3. Python常用内建模块

    Python常用内建模块 datetime 处理日期和时间的标准库. 注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import da ...

  4. super的用法

    1.调用父类的构造方法子类可以调用由父类声明的构造方法.但是必须在子类的构造方法中使用super关键字来调用. 2.操作被隐藏的成员变量和被覆盖的成员方法如果想在子类中操作父类中被隐藏的成员变量和被覆 ...

  5. Android--用DownLoadManager下载完成后启动安装

    当我们用系统的服务DownLoadManager下载完成后,系统会发送一个广播,我们只需要注册一个广播,然后在广播里面写如一些相应的操作. 1.注册广播 completeReceiver = new ...

  6. APM飞控修改数传模块方法

    APM飞控修改数传模块方法 硬件 ARDUCOPTER第二代 数传模块(USB接口) 数传模块(telem接口) usb-ttl模块 修改方法 注意:APM固件版本和数传模块估计版本是分开的,但有一定 ...

  7. C Primer Plus学习笔记

    1.汇编语言是特地的Cpu设计所采用的一组内部指令的助记符,不同的Cpu类型使用不同的Cpu C给予你更多的自由,也让你承担更多的风险 自由的代价是永远的警惕 2.目标代码文件.可执行文件和库 3.可 ...

  8. Linux C 文件与目录2 文件的打开与关闭

    文件的打开与关闭 open和close 文件的打开指的是从磁盘中找到一个文件,返回一个整形的打开文件顺序的编号.打开的文件处于可读.可写状态.文件的关闭指的是释放打开的文件,是文件处于不可读写的状态. ...

  9. 使用itunes同步ios时丢失照片恢复

    因没有备份,在使用同步功能后,发现照片被清空了,找到恢复方法,分享之! from:http://modmyi.com/forums/native-iphone-ipod-touch-app-discu ...

  10. “来用”alpha版使用说明书

    1引言 1 .1编写目的 针对我们发布的alpha版本做出安装和使用说明,使参与内测的人员及用户了解软件的使用方法和相关内容. 1 .2参考资料 <c#程序设计基础>,赵敏主编,2011, ...