- 博客(26)
- 收藏
- 关注
原创 条款49-52
条款49:了解new_handler的行为 operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个用户指定的错误处理函数,一个所谓的new_handler。为了指定这个函数,客户必须调用set_new_handler:namespace std{typedef void (*new_handler)();new_handler set_new_handl...
2018-05-28 19:43:02 209
原创 条款41-48
条款41:了解隐式接口和编译期多态 面向对象编程总是以显示接口和运行期多态解决问题。template及泛型编程的世界,与面向对象有根本不同,虽然显示接口和运行期多态仍然存在,但重要性降低,而隐式接口和编译期多态更为重要。 运行期多态和编译期多态类似于“哪一个重载函数被调用”(编译期)和“哪一个virtual函数该被绑定”(运行期)的差异类似。 显示接口由函...
2018-05-26 18:49:00 242 1
原创 第十八章
18.1.1 对未构造的内存中的对象进行赋值而不是初始化,其行为是未定义的。对许多类而言,这样做引起运行时崩溃。赋值涉及删除现存对象,如果没有现存对象,赋值操作符中的动作就会有灾难性效果。18.1.2allocator<T> a;定义名为 a 的 allocator 对象,可以分配内存或构造 T 类型的对象a.allocate(n)分配原始的未构造内存以保存 T 类型的 ...
2018-05-25 10:41:53 151
原创 第十七章
17.1.1 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。异常对象由编译器管理,而且保证驻留在可能被激活的任意 catch 都可以访问的空间。这个对象由 throw 创建,并被初始化为被抛出的表达式的副本。异常对...
2018-05-23 22:43:54 140
原创 第十六章
16.1.1 函数模板可以用与非模板函数一样的方式声明为 inline。说明符放在模板形参表之后、返回类型之前,不能放在关键字 template 之前。 16.1.3 模板形参遵循常规名字屏蔽规则。与全局作用域中声明的对象、函数或类型同名的模板形参会屏蔽全局名字: typedef double T;template <class T> T calc(con...
2018-05-21 16:17:35 150
原创 第十五章
基类成员函数 除了构造函数之外,任意非 static 成员函数都可以是虚函数。保留字只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。15.2.2 protected 还有另一重要性质: 派生类只能通过派生类对象访问其基类的 protected 成员,派生类对其基类类型对象的 protected 成员没有特殊访问权限:void Bulk_item:...
2018-05-12 19:16:53 208 1
原创 第十四章
14.1 用于内置类型的操作符,其含义不能改变。例如,内置的整型加号操作符不能重定义: // error: cannot redefine built-in operator for intsint operator+(int, int); 重载操作符必须具有至少一个类类型或枚举类型(第 2.7 节)的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符...
2018-05-09 21:52:45 141
原创 第十三章
13.1拷贝构造函数和赋值函数区别: 调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。 话句话说,就是初始化时调用的是拷贝构造函数,赋值时调用赋值操作。 复制初始化首先使用指定构造函数创建一个临时对象(第 7.3.2 节),然后用复制...
2018-05-08 22:11:25 1403
原创 第十二章
12.1.4 因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用: class LinkScreen {Screen window;LinkScreen *next;LinkScreen *prev;};12.2 基于成员函数是否为 const, 可以重...
2018-04-25 22:26:16 162
原创 条款32-40
条款32:确定你的public继承塑模出is-a关系 public inheritance意味“is-a”(是一种)的关系。如果令class D以public继承class B,即每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。B比D表现出更一般化的概念,而D比B表现出更特殊化的概念。B可以派上用场的地方,D对象一样可以派上用场,因为每一个D对象都是一个(是一种)B对象。...
2018-04-25 16:04:02 217
原创 第十一章
11.1关键概念:算法永不执行容器提供的操作 泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。算法基于迭代器及其操作实现,而并非基于容器操作。这个事实也许比较意外,但本质上暗示了:使用“普通”的迭代器时,算法从不修改基础容器的大小。正如我们所看到的,算法也许会改变存储在容器中的元素的值,也许会在容器内移动元素,但是,算法从不直接添加或删除元素。第 11.3.1 节...
2018-04-23 21:34:40 147
原创 第十章
10.3 map 是键-值对的集合。map 类型通常可理解为关联数组(associativearray) :可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联, 而并非通过元素在数组中的位置来获取。 在使用关联容器时, 它的键不但有一个类型, 而且还有一个相关的比较函数。默认情况下,标准库使用键类型定义的 < 操作符...
2018-04-21 17:14:39 156
原创 条款27-31
条款27:尽量少做转型动作class window{public:virtual void onResize(){...};...};class specialWindow:public window{public:virtual void onResize(){static_cast<window>(*this).onResize();}}; 上述...
2018-04-20 19:12:09 157
原创 第九章
9.1.1 将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同。 使用迭代器时,不要求容器类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。 不提供元素初始化式时, 标准库将为该容器实现值初始化(3.3.1节)。采用这种类型的初始化,元素类型必须是内置或复合类...
2018-04-19 17:40:35 116
原创 第八章
8.1IO 对象不可复制或赋值ofstream out1, out2;out1 = out2; // error: cannot assign stream objects// print function: parameter is copiedofstream print(ofstream);out2 = print(out2); // error: cannot copy strea...
2018-04-18 22:03:24 114
原创 条款20-26
条款20:宁以pass_by_reference替换pass_by_value 缺省情况下C++以by value方式传递对象至函数,这可能使得pass_by_value成为费时的操作。而pass_by_reference可以避免构造和析构操作,并且by reference方式传递参数可以避免slicing(对象切割)问题。当一个derived class对象以by value方式传...
2018-04-18 17:05:53 137
原创 第七章
C++ 语言使用调用操作符(即一对圆括号)实现函数的调用。 如果将形参定义为非引用的 const 类型: void fcn(const int i) { /* fcn can read but not write to i */ } 则在函数中,不可以改变实参的局部副本。由于实参仍然是以副本的形式传递,因此传递给 fcn 的既可以是 const 对象也...
2018-04-17 11:24:16 208
原创 第六章
6.6.5 对于 switch 结构,只能在它的最后一个 case 标号或 default 标号后面定义变量: case true:// error: declaration precedes a case labelstring file_name = get_file_name();break;case false: 制定这个规则是为避免出现代码跳过变量的定...
2018-04-16 15:12:18 137
原创 第五章
5.3.2只有在必要时才使用后置操作符 前置操作需要做的工作更少,只需加 1 后返回加 1 后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加 1 之前的值作为操作的结果。 对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。 5.11 一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。 5.12.6co...
2018-04-15 11:25:36 124
原创 条款11-17
条款11:在operator=中处理“自我赋值” 如果一段代码操作pointers或者references而它们被用来指向多个相同类型的对象,就需要考虑这些对象是否为同一个。实际上,只要来自同一继承体系,它们甚至不需要声明为相同类型就可以造成别名(如C++的多态性,base class的指针或者引用可以指向derived class)。class BitMap{};class Wi...
2018-04-13 22:06:34 146
原创 第四章
4.1.1 非 const 变量以及要到运行阶段才知道其值的 const变量都不能用于定义数组的维数。 int staff_size = 27; // nonconstconst unsigned sz = get_size(); // const value not known until run timedouble sala...
2018-04-13 11:50:54 121
原创 条款4-10
条款04:确定对象使用前已被初始化 对象成员变量的初始化发生在进入函数构造本体之前,在函数体内成员变量不是被初始化而是被赋值class A{public:A(const string &);private:string s;};A::A(const string &para){s=para; //这些是赋值而不是初始化}...
2018-04-12 22:52:08 180
原创 第三章
在头文件中最好使用完全限定的标准库名字,防止其中的using声明被应用于包含此头文件的源文件中。3.2.2cin>>string; //从第一个非空白字符到第一个空白字符,空白符任然存在于输入流中getline(cin,line); //读取到第一个换行符,并将换行符舍弃后存入line,换行符从输入流中除去3.2.3 string...
2018-04-12 17:42:13 103
原创 第二章
标准库定义了4个IO对象:标准输入——cin,标准输出——cout,标准错误——cerr,产生执行程序的一般信息——clog2.3.3 初始化: C++有两种初始化格式:复制初始化和直接初始化int ival=1024; //复制初始化int ival(1024); //直接初始化 初始化类类型对象时,复制初始化和直接初始化差别很微妙,详见13章,初始化内...
2018-04-11 22:40:59 143
原创 条款1-3
条款01:视C++为一个语言联邦将C++视为由四个次语言组成的联邦,每一个次语言都有自己的守则,跨越语言时,需要改变规则:C:C++以C为基础。区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(build_in data types)、指针(pointer)等统统来自CObject-Oriented C++:这部分也是C with Classe...
2018-04-11 11:21:09 131
原创 导读
函数签名式(signature): 函数签名式即为函数的参数和返回类型std::size_t numDigits(int number) 函数numDigits的签名式为std::size_t (int),即为函数获得一个int并返回一个std::size_t定义式(definition):提供编译器一些声明所遗漏的细节 对对象而言,是为对象分拨内存的地点,对funct...
2018-04-11 10:34:33 78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人