zoukankan      html  css  js  c++  java
  • C++中对象的创建和使用

    第二章 对象的创建和使用

     

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

     

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

     

      编译器:直接把源代码转化成汇编语言或机器指令。执行时不需要编译器,直接在支持目标代码的平台上运行。可以通过分段编译各段程序提高效率。

     

    编译器和解释器的工作流程可如下图所示。

     

    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; }

                               

  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/cao-jie/p/3453138.html
Copyright © 2011-2022 走看看