Effective C++ 49,50

49.熟悉标准库。

C++标准库很大。

首先标准库中函数很多,为了避免名字冲突,使用命名空间std。而之前的库函数都存放于< .h>中,现在成为伪标准库。而不能直接将这些头文件全部直接添加命名空间,标准委员会只能重新创建了不带.h的头文件。对于C中头文件采用同样的方法,但是每个名字前添加一个c,如C中的<string.h>变成了<cstring>。旧的c++头文件是官方反对使用的,但旧的c头文件不是,为了保持对C的兼容性。如 <string.h>是旧的C头文件,对应的是基于char*的字符串处理函数,<string>是包含了std的C++头文件,对应的是新的string类,而<cstring>是C头文件的std版本,但这里没有string类的旧c++版本,因为官方不推荐这样做。

第二,库中几乎都是模版。如iostream,操作字符流,流类实际就是类模版,在实例化流类的时候指定字符类型。即使是string,其实也是一个模版,类型参数限定了每个string类中的字符类型。string的类型声明是:

typedef basic_string<char, char_traits<char>, allocator<char> >
	string;

这里的字符类型与之前iostream中的字符类型是一个意思,它不是指char,指的是一个流中的字符,这里字符类型确定其参数,字符类型指的是字符集,因为不同的字符集在实现的细节上不同,如特殊的文件结束字符,拷贝他们的数组的最有效方式等,这些特征在标准中被称为traits。然后还有string对象执行动态内存分配的方法,使用一个Allocator参数,而Allocator类型的对象被用来分配和释放string对象的内存,其是一个内存管理器。不要手动的声明标准库中的任何部分。

Iostream,和传统的Iostream相比,它已经被模版化,继承层次结构也进行了修改,增加了抛出异常的能力,支持string(通过stringstream)和国际化(通过locales)。新的Iostream可以将string和文件当作流,还可以对流的行为做更广泛的控制,包括缓存和初始化。

容器,标准库中提供了一下的高效实现,vector,list,queue,stack,deque,map,set和bitset。string是容器,对容器的任何操作都适用于string。标准库的实现是高效的。使用容器可以消除动态分配内存造成的内存泄漏。

算法,标准库中提供了大量的简易方法,称为algorithm,实际为函数模版,其中大多数适用于库中所有容器以及内建数组。算法将容器的内容作为序列,每个算法可以应用与一个容器中所有值对应的一个序列,或者一个子序列。标准算法有,for_each 为序列中的每个元素调用某个函数, find 在序列中查找包含某个值的第一个位置, count_if 计算序列中满足某个判定为真的元素的数量,equal 判断两个序列包含的元素的值是否完全相等,search 在一个序列中找出某个子序列的起始位置,copy 拷贝一个序列到另一个,
unique 在序列中删除重复值, rotate 旋转序列中的值,sort 对序列中的值排序,等等。和容器操作一样,算法也有性能保证。

对国际化的支持。提供有助于开发出国际化软件的特性。支持国际化的最主要的构件是facets 和 locales 。facets描述的是对一种文化要处理哪些特性,包括排序规则(即某些地区字符集中的字符应该如何排序),日期和时间应该如何表示,数字和货币值应该如何表示,怎样将信息表示符映射成明确的语言信息,等等。locales 将多组facets捆绑在一起,facets是指前面说到的那些特性中的一个,而locales 表示多个facets组成的一个对于某个国家的规则,若一个locales表示美国人是如何解决前面几个问题的。

对于数字处理的支持。C++库中为复数类和专门针对数值编程而设计的特殊数组提供了模版。如valarray 类型的对象可以用来保存可以任意混叠的元素,

诊断支持,标准库支持三种报错方式:C的断言,错误号,例外 exception 。例外先派生出 logic_error 和 runtime_error ,然后再有这两个类派生出具体的错误类型,logic_error 表示软件中的逻辑错误,理论上可以通过更仔细的程序设计来防止。runtime_error 类型的例外为运行时才能发现的错误。

标准库中的容器和算法这部分一般被称为标准模版库 STL 。STL是标准库中最具创新的部分,它的体系结构具有扩展性,按照STL中的规范,可以进行很多扩展。

50.提高对C++的认识。

C++设计时的首要目标:与C的兼容性,效率,和传统开发工具及环境的兼容性,解决真实问题的可应用性(即面向对象)。

以上目标阐明了C++语言中大量的实现细节。如,为什么隐式生成的拷贝构造函数和赋值运算符要像现在这样工作,尤其是指针产生的浅拷贝问题?因为这是C对struct的拷贝和赋值的方式,要与C兼容。为什么析构函数不自动声明为virtual,为什么实现细节必须出现在类的定义中?因为不这样做会带来性能上的损失,效率很重要。为什么C++不能检测非局部静态对象间的初始化依赖关系?因为C++支持单独编译(即,分开编译源模块,然后将多个目标文件链接起来,形成可执行程序),依赖现有的链接器,不会程序数据打交道,所以c++编译器几乎不可能知道整个程序的一切情况。为什么C++不让程序员从一些繁杂事务如内存管理和低级指针操作中解脱出来?因为一些程序员需要这些处理能力,一个真正的程序员的需要自关重要。

时间: 2024-12-15 08:19:38

Effective C++ 49,50的相关文章

hdu 3555 Bomb(不要49,数位DP)

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 15102    Accepted Submission(s): 5452 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

输入一个正整数n,返回一个最小正整数m(m至少是2位数),使得m的各位乘积等于n,例如输入36,输出49,输入100,输出455,对于某个n不存在这样的m,请返回-1。

输入一个正整数n,返回一个最小正整数m(m至少是2位数),使得m的各位乘积等于n,例如输入36,输出49,输入100,输出455,对于某个n不存在这样的m,请返回-1. package hope20141002_01; import java.util.*; public class JingDong { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("

【转】最全的 pip 使用指南,50% 你可能没用过

[转]最全的 pip 使用指南,50% 你可能没用过 所有的 Python 开发者都清楚,Python 之所以如此受欢迎,能够在众多高级语言中,脱颖而出,除了语法简单,上手容易之外,更多还要归功于 Python 生态的完备,有数以万计的 Python 爱好者愿意以 Python 为基础封装出各种有利于开发的第三方工具包. 这才使用我们能够以最快的速度开发出一个满足基本需要的项目,而不是每次都重复造轮子. Python 从1991年诞生到现在,已经过去28个年头了,这其间产生了数以万计的第三方包,

核聚变发电,并不会价格便宜清洁无害,50年内实现几乎成悖论

https://www.toutiao.com/a6778590049064714752/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1578457945&app=news_article&utm_source=mobile_qq&utm_medium=toutiao_android&req_id=20200108123225010014047076260D8588&group_id=

Effective C++ 35,36,37

35.使公有继承体现 "是一个" 的含义. 共同拥有继承意味着 "是一个".如  class B:public A. 说明类型B的每个对象都是一个类型A的对象,A比B具有更广泛的概念.而B表示一个更特定的概念. 在C++中不论什么一个參数为基类的函数都能够实际取一个派生类的对象,仅仅有共同拥有继承会如此.对于共同拥有继承,如AB.若有两个函数 一个函数为 void fun1(A &a);还有一个函数为void fun2(B& b);则对于AB的两个对

基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器

首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -package.json -index.js -node_modules --bluebird --jquery --requirejs requireAsync函数 requireAsync函数是index.js里定义的一个全局函数,该函数接受无限多个字符串参数,参数为需要加载的模块名或模块路径,路径不

Effective java经验之谈,创建和销毁对象

关于Effective java 这本书,自己的一些总结性的思考.篇幅可能不按照目录来,因为自己喜欢先看哪一章就直接阅读了.不过能确定的是,每一章都会有总结.欢迎大家拍砖与补充. 1.      考虑用静态工厂的方法代替构造器.优点:有名字,不必每次创建对象,返回任何子类型对象,简洁的代码.缺点:该类将不能被子类化(复合大于继承,也是优点),不方便doc工具输出文档,一般约定的命名规则: valueOf  转换类型 getInstance 获得对象实例 newInstance 创建新的对象实例