第二章 对象的建立和使用前端
1:翻译器-源代码转化为机器代码(计算机能执行的形式)。一般能够分为两类:解释器(interpreter)和编译器(compiler)。ios
解释器:将源代码转化为一些动做并当即执行这些动做。如PHP,JavaScript。好处在于它从写代码到执行代码的转换几乎是当即完成的,而且源代码老是现存的,一旦出现错误能够当即指出。而坏处是它必须从新翻译任何重复的代码,执行变慢,且必须驻留内存以执行程序。数组
编译器:直接把源代码转化成汇编语言或机器指令。执行时不须要编译器,直接在支持目标代码的平台上运行。能够经过分段编译各段程序提升效率。函数
编译器和解释器的工做流程可以下图所示。spa
2:静态类型检查命令行
在编译器第一遍中会对函数的参数进行检查,以防止出现程序设计错误。而静态类型检查是指在编译阶段而不是运行阶段对其进行检查。相反的,则是动态类型检查。C++使用的就是静态类型检查。翻译
3:声明和定义设计
声明(declaration)和定义(definition)在C++中是两个不一样的概念,声明是向编译器介绍名字-标识符。而定义是说明在此创建变量或函数并为其分配内存空间。声明能够在多处不一样的地方,可是只能有一个定义。指针
int func1(int ,int ); //函数声明,包括返回值类型,函数名,参数列表和分号对象
int func1(int a, int b){} //函数定义,与声明不一样在于它有函数体且用括号代替分号
int a; //这个能够看作是一个变量声明,也能够看作是一个变量定义
定义声明+初始化,判断的主要原则是看是否占用内存。例以下面的例子:
class MyClass //类的声明,无内存占有
{
string myString; //string的声明
};
然而
#include<iostream>
//全局做用域
string myString;//定义,myString是实例化的string!
int main()
{
//Main函数体内
string myAnotherString;//定义,myAnotherString是实例化的string!
return 0;
} //类只是声明,不是真正建立对象,所以在类中不能写如const int len=10;这样的语句!
extern关键字用于代表“这是一个变量可是不定义它,它的定义在别的地方”。 那么上面的变量声明能够替换成extern int a。
4:C++文件类型
一般,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中前面的叫作C++源文件,里面存放的是C++源代码,然后面的为C++头文件,里面放的也是C++源代码。C++支持“分别编译”,能够分别对不一样的.cpp文件编译后造成的目标文件进行一次连接(link)便可。所以,在a.cpp文件中定义的一个全局函数能够经过b.cpp中调用,只须要在b.cpp中声明这个函数(编译时会产生一个符号表,连接时会根据符号表查源定义)。
头文件是一个含有某个库的外部声明函数和变量的文件。头文件不须要编译的,当某个.cpp文件须要调用时,能够经过宏命令“#include”将头文件包含进这个.cpp文件中。.h文件不用写在编译器的命令以后,可是必定要在编译器找的到的地方(如#include <header> 是从环境或编译器命令行指定的某种路径中查找,而#include“header.h”则是从当前目录开始查找,若是没找到再和前面的同样查找)
5:一个简单的C++程序
// hello.cpp
#include <iostream> //C++中标准输入输出类
using namespace std; //使用std名字空间
int main()
{
cout<<”hello,world!”<<endl; //数据的标准输出。其中用到了<<操做符重载
return 0;
}
在第三行中出现了名字空间的概念,所谓的名字空间就是一种描述逻辑分组的机制,也就是说若是有一些声明按照某种准则在逻辑上属于同一集团,就能够把他们放在同一个空间中。它主要是用来避免类名的冲突,若是是仅仅包含头文件,编译器没法找到任何有关函数和对象的声明,使用using namespace A来指明调用这个“名字空间的声明和定义”。
6:vector简介
C++中vector是一个线性顺序结构,至关于数组,可是其大小能够不预先指定,而且能够自动扩展。简单的说,能够看作是一个动态数组。因为vector是C++标准库的一部分,在使用时须要用头文件#include <vector>将其包含进去。而且,它也是std标准名字空间的一部分,故使用时能够直接用using namespace std便可。vector是一个类模板,而vector(int)是一种数据类型。
经常使用的vector构造函数
1:构造一个空元素的vector对象
vector <typename> v1;
2: 构造一个n个元素的vector对象(并不表述最多只能是n个元素),初始值全为0
vector <typename> v1(n);
3:构造n个元素的对象并初始化各元素项
vector <typename>v1(n, element());
4:构造一个原有的vector对象的拷贝
vector <typename>v1(v2);
vector对象的几种操做
12.vector <typename>::size_type x; //vector <typename>类型的计数,可用于循环如同for(int i)
式例说明:
#include <iostream> #include <cassert> #include <vector> using namespace std; int main() { vector<string> v(5, "hello"); //构造并初始化v vector<string> v2(v.begin(), v.end()); //构造v2并使其等于v
assert(v == v2); //assert宏断定表达式是否为真,若为假则先向标准错物流打印一条出错信息,而后经过调用abort来终止程序
cout<<"> Before operation"<<endl; for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it) cout<<*it<<endl; //经过it指针输出v
v.insert(v.begin() + 3, 4, "hello, world"); //在3位置插入4个“hello,world” cout<<"> After insert"<<endl; for(vector<string>::size_type i = 0; i < v.size(); ++i) //vector循环 cout<<v[i]<<endl;
vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6); //移除从3到6的string assert(*it == "hello, world"); //判断此时it是在哪里 cout<<"> After erase"<<endl; for(vector<string>::size_type i = 0; i != v.size(); ++i) cout<<v[i]<<endl;
assert(v.begin() + v.size() == v.end()); assert(v.end() - v.size() == v.begin()); return 0; }