
《c++ primer》读书笔记
文章平均质量分 64
birdlove1987
坚持必有回报
展开
-
从零单排c++ primer(19)
(1)一个模板参数名的可用范围是在其声明之后,至模板声明或定义结束之前。与任何其他名字一样,模板参数会隐藏外层作用域中声明的相同名字。(2)与大多数其他上下文不同,在模板内不能重用模板参数名,所以一个模板参数名在一个特定模板参数列表中只能出现一次。(3)模板声明必须包含模板参数,与函数参数相同,声明中的模板参数的名字不必与定义中的相同。(4)一个给定模板的每一个声明和定义必须有相同数量原创 2014-04-30 11:31:07 · 1033 阅读 · 0 评论 -
从零单排c++ primer(9)
(1) 一个初学者非常容易犯的错误是在一个空容器上调用fill_n,空容器长度为0。 vector vec; fill_n(vec.begin(),10,0);//灾难,修改了是个不存在的元素(2)向目的位置迭代器写入数据的算法假定目的位置足够大,能容纳要写入的元素。 (3)一种保证算法有足够元素空间来容纳原创 2014-04-21 09:53:57 · 1025 阅读 · 0 评论 -
从零单排c++ primer(10)
(1)在流迭代器中,默认初始化迭代器,这样就创建了一个可以当作尾后值使用的迭代器。(2)利用流迭代器在cin流中读取 int: istream_iterator in_iter(cin), eof; vector vec(in_iter , eof);(3)istream_i原创 2014-04-22 10:43:35 · 1215 阅读 · 0 评论 -
从零单排c++ primer(11)
(1)无序关联容器使用哈希函数。(2)在某些应用中,维护元素的序的代价非常高昂,此时无序容器也很有用。(3)无序容器的性能依赖于哈希函数的质量和桶的数量和大小。(4)无序容器在存储上组织为一组桶,每个桶保存零个或多个元素,使用一个哈希函数将元素映射到桶。(5)对于相同的参数,哈希函数必须总是产生相同的结果。(6) 静态内存用来保存局部static对象、类static数据成员以及原创 2014-04-23 09:13:04 · 1046 阅读 · 0 评论 -
从零单排c++ primer(12)
(1)函数退出有两种可能,正常处理结束或者发生了异常,无论哪种情况,局部对象都会被销毁。(2)当发生异常时,直接管理的内存是不会自动释放的。(3) 大多数应用应该使用标准库容器而不是动态分配的数组。使用容器更为简单、更不容易出现内存管理错误并且可能有更好的性能。(4) 通常称new T[ ]分配的内存为“动态数组”,但并不是数组类型。(5) 在默认情况下,new分配的对象,不管是单原创 2014-04-24 09:37:15 · 1253 阅读 · 0 评论 -
从零单排c++ primer(13)
(1)类的行为像一个值,意味着它应该也有自己的状态,行为像指针的类则共享状态。(2)为了提供类值得行为,对于类管理的资源,每个对象都应该拥有一份自己的拷贝。(3) 与拷贝控制成员不同,swap并不是必要的。但是,对于分配了资源的类,定义swap可能是一种重要的优化手段。(4) 使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。(5) 拷贝赋值运算符通常执行拷贝构造函原创 2014-04-25 10:26:13 · 1254 阅读 · 0 评论 -
从零单排c++ primer(14)
(1)区分移动和拷贝的重载函数通常有一个版本接受一个const T&,而另一个版本接受一个 T&&。(2)如果一个成员函数有引用限定符,则具有相同参数列表的所有版本都必须有引用限定符。(3)当运算符作用域类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。(4)重载的运算符是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符共同组成。(5) 重载运原创 2014-04-26 10:49:17 · 1258 阅读 · 2 评论 -
从零单排c++ primer(17)
(1)如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义。(2)派生类的成员将隐藏同名的基类成员。(3)除了覆盖继承而来的虚函数之外,派生类最好不要重用其他定义在基类中的名字。(4)声明在内层作用域的函数并不会重载声明在外层作用域的函数。定义在派生类中的函数也不会重载其基类中的成员。(5)基类函数的每个实例在派生类中都必须是可访问。对派生原创 2014-04-28 07:08:35 · 1544 阅读 · 0 评论 -
从零单排c++ primer(15)
(1)面向对象程序设计(OOP)的核心思想是数据抽象、继承和动态绑定。(2)通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类。其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类。(3)基类负责定义在层次关系中所有类的共同拥有的成员,而每个派生类定义各自特有的成员。(4)在c++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。(5原创 2014-04-27 11:07:58 · 1335 阅读 · 5 评论 -
从零单排c++ primer(16)
(1)基类的指针或引用的静态类型可能与其动态类型不一致。(2)之所以存在派生类向基类的类型转换是因为每个派生类对象都包含一个基类部分,而基类的引用或指针可以绑定到该基类部分上。(3)一个基类的对象既可以以独立的形式存在,也可以作为派生类对象的一部分存在。(4)编译器在编译时无法确定某个特定的转换在运行时是否安全,这是因为编译器只能通过检查指针或者引用的静态类型来推断该转换是否合法。原创 2014-04-27 18:38:36 · 1223 阅读 · 0 评论 -
从零单排c++ primer(8)
(1)向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效。(2)当用一个对象来初始化容器时,或将一个对象插入到容器中时,实际上放入到容器中的是对象值的一个拷贝,而不是对象本身。(3)insert函数将元素插入到迭代器所指定的位置之前。(4)将元素插入到vector、deque和string中的任何位置都是合法的。然后这样做可能很耗时。(5)原创 2014-04-20 10:04:31 · 978 阅读 · 0 评论 -
从零单排c++ primer(7)
(1)如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始化值列表为这些成员提供初值。(2)最好令构造函数初始值的顺序与成员声明的顺序保持一致,而且如果可能的话,尽量避免使用某些成员初始化其他成员。(3)如果一个构造函数为所有的参数都提供了默认实参,则它实际上也定义了默认构造函数,(4)如果定义了其他构造函数,最好也提供一个默认构造函数。(5原创 2014-04-19 12:16:25 · 942 阅读 · 0 评论 -
从零单排c++ primer(6)
(1)在含有return语句的循环后面应该也有一条return语音,如果没有的话该程序就是错误的,很多编译器都无法发现此类错误。(2)main函数不能调用自己。(3)如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数,main函数不能重载。(4)不允许两个函数除了返回类型外其他所有的要素都相同。(5)在函数的返回值前面加上一个inline,这样就可以将函数定义为内原创 2014-04-18 11:58:10 · 1152 阅读 · 0 评论 -
从零单排c++ primer(20)
(1)如果函数参数类型不是模板参数,则对实参进行正常的类型转化。(2)当我们用一个函数模板初始化一个函数指针或为一个函数指针赋值时,编译器使用指针的类型来推断模板实参。(3)当参数是一个函数模板实例的地址时,程序上下文必须满足:对每个模板参数能唯一确定其类型或值。(4)当一个函数参数是模板类型参数的一个普通引用时,绑定规则告诉我们,只能传递给它一个左值。(5)如果一个函数参数的类型原创 2014-04-30 15:55:48 · 1140 阅读 · 0 评论 -
从零单排c++ primer(22)
(1)c++程序不应该使用库函数rand,而应使用default_random_engine类和恰当的分布类对象。(2)定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类和随机数分布类。(3)对于大多数场合,随机数引擎的输出是不能直接使用的,这也是为什么早先我们称之为原是随机数。(4)类似引擎类型,分布类型也是函数对象类,分布对象使用它的引擎参数生成随机数原创 2014-05-01 10:10:59 · 964 阅读 · 0 评论 -
从零单排c++ primer(23)
(1)在栈展开的过程中,运行类类型的局部对象的析构函数。因为这些析构函数是自动执行的,所以它们不应该抛出异常。一旦在栈展开过程中析构函数抛出了异常,并且析构函数自身没能捕获到该异常,则程序将被终止。(2)抛出指针要求在任何对应的处理代码存在的地方,指针所指的对象都必须存在。(3)通常情况下,如果catch接受的异常与某个继承体系有关,则最好将该catch的参数定义成引用类型。、(4)如原创 2014-05-01 15:25:43 · 1035 阅读 · 0 评论 -
从零单排c++ primer(21)
(1)可变参数函数通常是递归的: template ostream &print(ostream &os , const T &t , const Args&... rest) { os ret原创 2014-05-01 00:22:41 · 1035 阅读 · 0 评论 -
从零单排c++ primer(24)(完)
(1)一个命名空间可以有好几个同义词或别名,所有别名与命名空间原来的名字等价。(2)如果我们提供了一个对std等命名空间的using指示而为做任何特殊控制的话,将重新引入使用了多个库而造成的名字冲突问题。(3)可以从函数的限定名推断出查找名字时检查作用域的次序,限定名以相反次序指出备查找的作用域。(4)当我们给函数传递一个类类型的对象时,除了在常规的作用域查找外还会查找实参类所属的命名原创 2014-05-01 23:52:22 · 1285 阅读 · 1 评论 -
从零单排c++ primer(5)
(1)c++表达式要不然是右值,要不然就是左值。(2)当一个对象被用作右值的时候,用的是对象的值,当一个对象被用作左值的时候用的是对象的身份。(3)在需要左值的地方可以用右值来代替,但是不能把右值当成左值使用。(4) 对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。 int i = 0;原创 2014-04-17 09:20:57 · 1008 阅读 · 0 评论 -
从零单排c++ primer(3)
(1)有两种方法可以定义类型别名,1.使用typedef typedef double wages; typedef wages base, *p; 2.使用别名声明using原创 2014-04-15 09:13:17 · 845 阅读 · 0 评论 -
从零单排c++ primer(1)
(1)数据类型决定了程序中数据和操作的意义。(2)基本内置类型中算术类型包括:a.整数型 b.浮点型(3)大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小块成为“字节”,存储的基本单元成为“字”。 (4)浮点型可表示单精度、双精度和扩展精度值。(5) 关于类型转换: 1.当把一个非布尔型的算术值赋给布尔型时,初始值为0则结果为false,否则结原创 2014-04-13 21:37:58 · 1253 阅读 · 0 评论 -
从零单排c++ primer(4)
(1)和指针不一样的是,获得迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都名为begin和end的成员。(2)在特殊情况下如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。(3) 拥有迭代器标准库类型使用iterator和const_iterator来表示迭代器的类型。(4)begin和end返回的具体类型由对象是否是常量决定,如原创 2014-04-16 16:06:59 · 953 阅读 · 0 评论 -
从零单排c++ primer(2)
(1)const对象一旦创建后其值就不能在改变,所以const对象必须初始化,初始化的值可以是表达式。(2)在默认状态下,const对象仅在文件内有效,当多个文件中出现同名的const变量时,其实等同于在不同的文件中分别定义了独立的变量。(3)在一个文件中定义const,在多文件中声明并使用它的解决办法是:对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就可原创 2014-04-14 09:30:51 · 836 阅读 · 0 评论 -
从零单排c++ primer(18)
(1)一个非类型参数可以是一个整形或者是一个指向对象或函数类型的指针或引用。(2)绑定指针或引用非类型参数的实参必须具有静态的生存期,不能用一个普通局部变量或动态对象作为指针或引用非类型模板参数的实参。(3)模板程序应该尽量减少对实参类型的要求。(4)当编译器遇到一个模板定义时,它并不生成代码。只是当我们实例化出模板的一个特定的版本时,编译器才会生成代码。(5)函数模板和类模板成员原创 2014-04-29 09:06:59 · 1041 阅读 · 0 评论