透彻深入C++ ——概述篇

C与C++

  1. C++维持了C的子集,并没有对C的清除,即C的语句在C++中同样可以被编译,包括C的函数调用。
  2. C是比较底层的,接近汇编语言的语言,而C++在C的基础上,有更强的表达能力。
  3. C++在内部类型上与C的差异并不大,而只不过是C++提供了一些包含容器和算法的标准库,增强了其表达能力。
  4. C++加入了类型系统,对大程序的支持性更高。

注意:在C++程序中,应该避免以下C语言风格明显的应用:

  • 避免宏(#define),而采用const,enum,inline等替代
  • 可以在任何地方定义变量,而非像C一样,所有定义在所有使用之前。尽量在使用前再声明,并立即初始化。
  • 不要使用malloc(),relloc()等动态分配内存了,有了new及一些vector等的容器。new的实质就是指定实例的内存分配。
  • 减少指针算术,void *等
  • 少用C的字符串,即char[],使用C++标准库中的string替代
  • 少用C的数组,即[],使用C++中的容器,如vector替代

C++概述

要点记录:
1.说某种语言支持某种风格的程序设计范型(面向对象,面向过程等),是说其提供了一些功能,使其能容易,安全,有效得使用这种风格,而不支持,只是说其没有设计并提供这样的功能,可以说是不直接支持而已。
2.C++几种程序设计范型:过程式->模块->面向对象(类)->通用型
     这是一个功能逐渐递增的功能,后面的是在前驱的基础上建立的。

  • 过程式程序设计

    1.{}的实质是结成组
    2.内部变量:bool,char,int,double 它的实质是对应的一些特定的硬件功能,这是弱类型语言(var)的重要考量之处。char为一个字节,int为一个机器字(字或双字)
    3.C++有基本类型之间有意义的自动转换能力,省去了C中的强转
    4.* 指针,作用在指针上 , &取地址,作用在变量上。

  • 模块程序设计
    1.数据隐藏原理:组织数据的一种重要思路,即封装。
    namespace 可以将特定的数据和函数组织到一个指定的名字空间。
    namespace::函数/变量 即可明确使用一个特定空间内的函数
    2.支持C语言里的分别编译,即头文件(.h)的作用。头文件内声明的是一些模块的界面,即所有程序都能在调用的函数或者允许访问的数据,而不涉及具体的实现。该模块的实现者通过引入头文件,在其程序内实现该模块。而该模块的使用者引入头文件,即可在自己的程序中通过该模块的界面来使用该模快。这时,该模块的实现和使用就可以作为分别编译了。
    3.异常检查:异常检查在模块化下的重要性体现出来,使用者往往无法自己检测到异常,而需实现者自己检测到异常,但并不需要其处理,只需throw。而使用者自己设置处理器(try-catch)

  • 面向对象程序设计
    1.抽象数据类型(用户定义类型)class:内部包含:数据,函数(构造函数(必与类名相同,可以多个),自定义函数,operator(运算符重定义函数,定义之后,基于该指定运算符的操作就会调用自定义的函数),析构函数(~类名,用来清理对象))。相比于模块更加强调类型的抽象特征,即实例彼此无联系,这种机制是由C++提供的。而模块则更强调封装,如果不加以处理,很可能会多个使用该模块的用户,使用的是同一个数据。即class更像进程,模块更像线程。
    2.类型分为具体类型,抽象类型。具体类型会先声明类的数据,函数以及异常,并在会给出函数的实现,通过类名:函数名可以在类声明之外实现。抽象类型(多态类型):是为了将具体类型的界面和实现分开来而设立的,这样用户可以使用一个高度抽象的界面来使用该抽象类型,而无须考虑具体的数据。这之后需要用户从抽象类型派生(:public)多个具体类型,并将抽象类型中的virtual关键字声明的虚函数,在自己的类里实现了(要求重名),这之后,用户就可以对用这个具体类型组来通过一个统一的访问抽象类型的函数及C++的多态机制,根据情况来调用具体类型中的实现了的函数,而不用对每一个具体类型的实现细节有所了解。
    3.继承机制:除了之前的具体类型和抽象类型之间的继承之外,也包含一般化的具体类型之间的继承。继承产生了超类和子类。子类继承超类的属性,也可以重定义超类的函数。

  • 通用型程序设计(泛型 template < class T>)
    1.针对数据结构和算法的逻辑进行设计,而将作用的类型参数化,以使其具有通用性。广泛应用在容器类(模板)和通用型算法上。
    2.迭代器和序列:为了忽略实际的属性,引入的概念。迭代器关注的是序列的位置和在该位置上的操作。而迭代器在不同类型上是不同的,而由类型自己知晓就好。如指针和数组下标,对于内部类型的数组,其迭代器就是其地址,用&得到。
    3.有了通用的设计,可以有效支持多种类型序列间的彼此操作。运行使用者自由搭配。

标准库概述(STL)

  1. 标准库定义在std的名字空间(namespace)中,所以要使用其内功能,需要加std::,或者直接声明using namespace std,声明之后就表示将指定名字空间中的每个功能都声明为全局的,当前使用的空间就是全局空间。
  2. 标准库中的功能都需要使用include将< isostream>< string>< vector>等包含进来。
  3. < iostream> 提供的是对内部类型的输入输出方法,读入string时,空格/换行是默认的结束符。
    < string>是C++的字符串,包含拼接(+),比较(==),而getline(cin,string)是以换行符为结束,可以读入空格。
    子串(substr),替换(replace),转换成C语言风格的字符串,即\0结尾的字符数组(c_str)。
    < vector> 相当于动态数组,使用构造函数指定初始大小和初始元素,可以使用=直接彼此赋值。vector中[]没有范围检查,而at()有。
    < list>:(双向链)表。适合于插入和删除频繁的序列。一般不用下标来直接随机访问,适合使用迭代器顺序访问,从begin至end,在迭代器上,*为得到引用的元素,++为移动迭代器。迭代器根据其作用也分为很多种,包括像一般的iterator,用于不修改元素的const_interator等。包括push_back(元素),push_front(元素),insert(位置,元素)。
    < map>:关联数组/映射;支持基于值的检索。总使用键值排序存储,这也是它支持快速检索的基础。

    这些容器类的基本操作是相似的,其对各种操作的支持性的差异是体现在其迭代器的实现方式上的。

  4. < algorithm>定义了一些基于容器,基于序列(两个迭代器截断的一个部分)和迭代器的基本算法。sort(.begin(),.end(),cmp)排序
    copy(y.begin(),y.end(),iterator x) 复制y至迭代器x之后,如果是追加的话,就是.back_inserter(),该迭代器会指向end(),但是会自动扩充容器。
    find(x,y):查找x中y出现的第一个迭代器,否则返回end(),注意end不是指最后一个元素,而是最后一个元素之后的位置。
    count(.begin(),.end(),元素) 统计指定序列中,元素出现的次数。
    for_each(.begin(),.end(),函数名);对序列的每一个迭代器执行该函数,该函数的输入为该迭代器指向的值。相当于一个循环。该函数称为成员函数
    find_if(.begin(),.end(),函数名):谓词查询/根据条件查询。对序列的每一个迭代器调用该函数(该函数会对每一个迭代器对印应的值输出一个bool),返回第一个为true的迭代器。
    count_if(.begin(),.end(),函数名):同上,返回true次数。
    mem_fun(&成员函数名):该函数的参数是一个指向成员函数的指针,可以被一个指向 该成员所在类 的指针调用,而实际是去使用该成员去调用指定的成员函数。常用于指针容器的for_each,可以使用 mem_fun这一个函数直接调用成员函数,就好像容器内存的不是指针,而是成员。
  5. 迭代器与I/O:迭代器描述的是序列的意义,而序列式可以用作输入输出流的。
    ostream_iterator< string> oo(cout):指定标准输出流的迭代器。oo就相当于指向当前标准输出流末位置的一个迭代器,*oo就相当于为其赋值,现在string是输出类型,所以每次赋值之后,oo++,就是跨过这个string,重新至末端。这里相当于把标准输出看作一个只能写入的容器。
    istream_iterator< string> ii(cin):
    istream_iterator< string> eos:对于输入,由于需要指定输入的范围,需要两个迭代器指定一个序列。
    利用一个流序列中的迭代器,我们就可以把流和容器关联起来,比如可以使用输入迭代器指定一段字符串序列,然后直接使用vector< string> b(ii,eos),将该字符串序列直接转换为一个字符串vector,同理输出vector至输出流,也可以使用copy或unique_copy()来实现,
  6. 数值计算:复数(complex),向量(valarray),基本数值的计算。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值