《Thinking in C++》学习笔记(一)【第二章】
第二章 对象的创建与使用
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++》学习笔记(一)【第二章】的更多相关文章
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...
- 流畅的python学习笔记:第二章
第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...
- Python 3.5学习笔记(第二章)
本章内容 1.模块 2.数据类型与数据运算 3.进制 4.byte 与 string 的互相转换 5.列表 6.元组 7.字符串操作 8.字典 一.模块 Python 把某些常用的定义存放在文件中,为 ...
- Python基础教程学习笔记:第二章 列表和元组
1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串 ...
- STL学习笔记(第二章 C++及其标准程序库简介)
本章重点是介绍与C++标准程序库相关的几个最重要的语言新特性 template(模板) 程序库中几乎所有东西都被设计成template形式.所谓templates,是针对“一个或多个尚未明确的型别”所 ...
- UNP学习笔记(第二章:传输层)
本章的焦点是传输层,包括TCP.UDP和SCTP. 绝大多数客户/服务器网络应用使用TCP或UDP.SCTP是一个较新的协议. UDP是一个简单的.不可靠的数据报协议.而TCP是一个复杂.可靠的字节流 ...
- JavaScript DOM编程艺术-学习笔记(第二章)
1.好习惯从末尾加分号:开始 2.js区分大小写 3.程序界万能的命名法则:①不以,数字开头的数字.字母.下划线.美元符号 ②提倡以下划线命名法来命名变量,以驼峰命名法来命名函数.但是到了公司往往会身 ...
- ArcGIS API for JavaScript 4.2学习笔记[4] 第二章其余感兴趣的例子
先马克,估计要用到的有: 视图存档 2D地图添加指南针 视图移动 鹰眼 2D3D视图同步.同视图不同数据同步 以后实战的时候再仔细研究研究.
- 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)
一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...
随机推荐
- .NET开源工作流RoadFlow-流程设计-流程属性设置
打开流程设计器点击新建流程后会弹出新流程属性设置框,属性设置包括基本信息,数据连接和标识字段三项设置. 1.基本信息 流程ID:系统自动给每个流程分配的一个唯一ID. 流程名称:给您的新流程取一个名称 ...
- oracle自定义job名字,job调度
一.调试创建 begin -- create_schedule dbms_scheduler.create_schedule(schedule_name => 's_change_send_da ...
- Windows Phone 8.1SDK新特性预览
前言 Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...
- Mac下如何显示隐藏文件/文件夹_百度经验
在应用程序里打开终端, cd 你的文件夹名 ls -a 即可显示该文件夹下的所有隐藏文件 如果你想打开整个系统的隐藏文件可以在终端下输入以下命令: defaults write com.apple ...
- How to Call a synchronize function asynchronizly in C#
How to call a function asynchronizly in C# # Page1- Delegate.begininvoke, endinvoke BeginInvoke and ...
- Junit单元测试中优先使用AssertThat
主要的优点: 1. 易读性 2. 错误信息更方便 推荐阅读:https://objectpartners.com/2013/09/18/the-benefits-of-using-assertthat ...
- 硬件相关-ADC原理(未完成)
一.模数转换的一般步骤: 1)采样和保持 为了把模拟信号转换成对应的数字信号,必须首先将模拟量每隔一定时间抽取一次样值,使时间上连续变化的模拟量变为一个时间上断续变化的模拟量,这个过程称为采样. 为了 ...
- Gulp的安装
Gulp 是前端自动化开发工具,我们可以用它提高开发效率. 它有以下用途: 压缩js.压缩css.压缩less.压缩图片等功能 首先我们开始安装Gulp Gulp是基于node来实现的,所以应该先安装 ...
- STL容器的适用情况
转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...
- TCP 粘包/拆包问题
简介 TCP 是一个’流’协议,所谓流,就是没有界限的一串数据. 大家可以想想河里的流水,是连成一片的.期间并没有分界线, TCP 底层并不了解上层业务数据的具体含义 ,它会根据 TCP 缓冲区 ...