- 博客(18)
- 收藏
- 关注
原创 第十二章
12.1.4 因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用: class LinkScreen {Screen window;LinkScreen *next;LinkScreen *prev;};12.2 基于成员函数是否为 const, 可以重...
2018-04-25 22:26:16 161
原创 条款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 216
原创 第十一章
11.1关键概念:算法永不执行容器提供的操作 泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。算法基于迭代器及其操作实现,而并非基于容器操作。这个事实也许比较意外,但本质上暗示了:使用“普通”的迭代器时,算法从不修改基础容器的大小。正如我们所看到的,算法也许会改变存储在容器中的元素的值,也许会在容器内移动元素,但是,算法从不直接添加或删除元素。第 11.3.1 节...
2018-04-23 21:34:40 144
原创 第十章
10.3 map 是键-值对的集合。map 类型通常可理解为关联数组(associativearray) :可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联, 而并非通过元素在数组中的位置来获取。 在使用关联容器时, 它的键不但有一个类型, 而且还有一个相关的比较函数。默认情况下,标准库使用键类型定义的 < 操作符...
2018-04-21 17:14:39 154
原创 条款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 155
原创 第九章
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 113
原创 条款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 130
原创 第七章
C++ 语言使用调用操作符(即一对圆括号)实现函数的调用。 如果将形参定义为非引用的 const 类型: void fcn(const int i) { /* fcn can read but not write to i */ } 则在函数中,不可以改变实参的局部副本。由于实参仍然是以副本的形式传递,因此传递给 fcn 的既可以是 const 对象也...
2018-04-17 11:24:16 207
原创 第六章
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 135
原创 第五章
5.3.2只有在必要时才使用后置操作符 前置操作需要做的工作更少,只需加 1 后返回加 1 后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加 1 之前的值作为操作的结果。 对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。 5.11 一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。 5.12.6co...
2018-04-15 11:25:36 123
原创 条款11-17
条款11:在operator=中处理“自我赋值” 如果一段代码操作pointers或者references而它们被用来指向多个相同类型的对象,就需要考虑这些对象是否为同一个。实际上,只要来自同一继承体系,它们甚至不需要声明为相同类型就可以造成别名(如C++的多态性,base class的指针或者引用可以指向derived class)。class BitMap{};class Wi...
2018-04-13 22:06:34 145
原创 第四章
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 179
原创 第三章
在头文件中最好使用完全限定的标准库名字,防止其中的using声明被应用于包含此头文件的源文件中。3.2.2cin>>string; //从第一个非空白字符到第一个空白字符,空白符任然存在于输入流中getline(cin,line); //读取到第一个换行符,并将换行符舍弃后存入line,换行符从输入流中除去3.2.3 string...
2018-04-12 17:42:13 102
原创 第二章
标准库定义了4个IO对象:标准输入——cin,标准输出——cout,标准错误——cerr,产生执行程序的一般信息——clog2.3.3 初始化: C++有两种初始化格式:复制初始化和直接初始化int ival=1024; //复制初始化int ival(1024); //直接初始化 初始化类类型对象时,复制初始化和直接初始化差别很微妙,详见13章,初始化内...
2018-04-11 22:40:59 138
原创 条款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 127
原创 导读
函数签名式(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关注的人