C++中对象的建立和使用

第二章 对象的建立和使用前端

 

1:翻译器-源代码转化为机器代码(计算机能执行的形式)。一般能够分为两类:解释器(interpreter)和编译器(compiler)ios

 

  解释器:将源代码转化为一些动做并当即执行这些动做。如PHPJavaScript。好处在于它从写代码到执行代码的转换几乎是当即完成的,而且源代码老是现存的,一旦出现错误能够当即指出。而坏处是它必须从新翻译任何重复的代码,执行变慢,且必须驻留内存以执行程序数组

 

  编译器:直接把源代码转化成汇编语言或机器指令。执行时不须要编译器,直接在支持目标代码的平台上运行。能够经过分段编译各段程序提升效率。函数

 

编译器和解释器的工做流程可以下图所示。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

 

4C++文件类型

一般,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中前面的叫作C++源文件,里面存放的是C++源代码,然后面的为C++头文件,里面放的也是C++源代码。C++支持“分别编译”,能够分别对不一样的.cpp文件编译后造成的目标文件进行一次连接(link)便可。所以,在a.cpp文件中定义的一个全局函数能够经过b.cpp中调用,只须要在b.cpp中声明这个函数(编译时会产生一个符号表,连接时会根据符号表查源定义) 

 

头文件是一个含有某个库的外部声明函数和变量的文件。头文件不须要编译的,当某个.cpp文件须要调用时,能够经过宏命令“#include”将头文件包含进这个.cpp文件中。.h文件不用写在编译器的命令以后,可是必定要在编译器找的到的地方(#include <header> 是从环境或编译器命令行指定的某种路径中查找,而#includeheader.h”则是从当前目录开始查找,若是没找到再和前面的同样查找)

 

5:一个简单的C++程序

// hello.cpp

#include <iostream>   //C++中标准输入输出类

using namespace std;  //使用std名字空间

 

int main()

{

cout<<”helloworld”<<endl; //数据的标准输出。其中用到了<<操做符重载

return 0;

}

在第三行中出现了名字空间的概念,所谓的名字空间就是一种描述逻辑分组的机制,也就是说若是有一些声明按照某种准则在逻辑上属于同一集团,就能够把他们放在同一个空间中。它主要是用来避免类名的冲突,若是是仅仅包含头文件,编译器没法找到任何有关函数和对象的声明,使用using namespace A来指明调用这个“名字空间的声明和定义”。

 

6vector简介

C++vector是一个线性顺序结构,至关于数组,可是其大小能够不预先指定,而且能够自动扩展。简单的说,能够看作是一个动态数组。因为vectorC++标准库的一部分,在使用时须要用头文件#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对象的几种操做

  1. v.push_back(t)    //在容器的最后添加一个值为t的数据,容器的size变大。另外listpush_front()函数,在前端插入,后面的元素下标依次增大。 2. v.size()           //返回容器中数据的个数
  2. v.empty()        //判断vector是否为空 4. v[n]              //返回v中位置为n的元素 5. v.insert(pointer,number, content)    //向vpointer指向的位置插入numbercontent的内容。还有v. insert(pointer, content)v.insert(pointer,a[2],a[4])a[2]a[4]三个元素插入。 6. v.pop_back()     //删除容器的末元素,并不返回该元素。 7.v.erase(pointer1,pointer2)  //删除pointer1pointer2中间(包括pointer1所指)的元素。vector中删除一个元素后,此位置之后的元素都须要往前移动一个位置,虽然当前迭代器位置没有自动加1,可是因为后续元素的顺次前移,也就至关于迭代器的自动指向下一个位置同样。 8. v1==v2          //判断v1v2是否相等。 9. =<<=>>=      //保持这些操做符惯有含义。 10. vector<typeName>::iterator p=v1.begin( );  //p初始值指向v1的第一个元素。*p取所指向元素的值。对于const vector<typeName>只能用vector<typeName>::const_iterator类型的指针访问。 11.v.clear()      //删除容器中的全部元素。

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“helloworld” 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); //移除从36string 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; }

相关文章
相关标签/搜索