- 博客(126)
- 资源 (2)
- 收藏
- 关注
原创 C++编程思想 第1卷 第15章 多态性和虚函数 向上类型转换
对象作为它自己的类或作为它的基类的对象来使用还能通过基类的地址操作它取一个对象的地址 指针或引用,并将其作为基类的地址来处理,这称为向上类型转换 upcasting,因为继承树的绘制方式是以基类为顶点的//: C14:Instrument.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceE...
2018-07-31 19:40:26 149
原创 C++编程思想 第1卷 第14章 继承和组合 向上类型转换 继承和组合再论
确定应当用组合还是用继承,最清楚的方法之一询问是否需要从想你向上类型转换Stack类通过继承被专门化,然而,StringStack对象仅作为string容器,不需要向上类型转换,所以更适合的方法可能是组合//: C14:InheritStack2.cpp// From Thinking in C++, 2nd Edition// Available at http://www.B...
2018-07-31 14:48:12 113
原创 C++编程思想 第1卷 第14章 继承和组合 向上类型转换 向上类型转换和拷贝构造函数
如果允许编译器为派生类生成拷贝构造函数,它将首先自动地调用基类的拷贝构造函数,然后再是各成员对象的拷贝构造函数,可以得到正确的操作//: C14:CopyConstructor.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000...
2018-07-31 14:28:55 129
原创 C++编程思想 第1卷 第14章 继承和组合 向上类型转换
由ifstream派生来的类的对象如何有ifstream对象的所有特性和行为继承最重要的方面不是它为新类提供了成员函数,而是它是基类与新类之间的关系,这种关系可描述为 新类属于原有类的类型继承直接由编译器支持//: C14:Instrument.cpp// From Thinking in C++, 2nd Edition// Available at http://www.B...
2018-07-31 13:54:19 107
原创 C++编程思想 第1卷 第14章 继承和组合 运算符重载与继承
除了赋值运算符以外,其余的运算符可以自动地继承到派生类中//: C14:OperatorInheritance.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright.t...
2018-07-31 13:30:28 128
原创 C++编程思想 第1卷 第14章 继承和组合 protected
学习了继承,而关键字protected对于继承有特殊的意义最好让数据成员是private,因为我们应该保留改变内部实现的权利然后才能通过protected成员函数控制对该类的继承者的访问//: C14:Protected.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com...
2018-07-31 13:02:33 110
原创 C++编程思想 第1卷 第14章 继承和组合 组合与继承的选择 私有继承
通过在基类表中去掉public或者通过显式地声明private,可以私有地继承基类private继承的目的是什么,因为在这个新类中使用组合创建一个private对象的选择似乎更合适当私有继承时,基类的所有public成员都变成了private如果希望它们中的任何一个是可视的,只要用派生类的public部分声明它们的名字即可//: C14:PrivateInheritance....
2018-07-31 12:42:02 125
原创 C++编程思想 第1卷 第14章 继承和组合 组合与继承的选择 子类型设置
创建ifstream对象的一个类,它不仅打开一个文件,而且还保存文件名这时可以使用组合把ifstream及string都嵌入这个新类中//: C14:FName1.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copy...
2018-07-31 09:23:21 121
原创 C++编程思想 第1卷 第14章 继承和组合 组合与继承的选择
无论组合还是继承都能把子对象放在新类型中组合通常是在希望新类内部具有已存在类的功能时使用,而不是希望已存在类作为它的接口有时,希望允许类用户直接访问新类的组成,这就让成员对象是public由于成员对象使用自己的访问控制,所以是安全的//: C14:Car.cpp// From Thinking in C++, 2nd Edition// Available at http:/...
2018-07-31 09:12:07 109
原创 C++编程思想 第1卷 第14章 继承和组合 非自动继承的函数
不是所有的函数都能自动地从基类继承到派生类中的operator= 也不能被继承,因为它完成类似于构造函数的活动在继承工程中,如果不亲自创建这些函数,编译器就会生成它们//: C14:SynthesizedFunctions.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.co...
2018-07-31 09:03:16 125
原创 C++编程思想 第1卷 第14章 继承和组合 名字隐藏
继承一个类并且对它的成员函数重新进行定义,会出现两种情况第一种是基类的定义一样,在派生类的定义中明确地调用操作和返回类型称为普通成员函数的重调用,如果基类的成员函数是虚函数的情况,可称之为重写如果在派生类中改变了成员函数参数列表和返回类型,会发生什么//: C14:NameHiding.cpp// From Thinking in C++, 2nd Edition// Avai...
2018-07-30 14:54:25 125
原创 C++编程思想 第1卷 第14章 继承和组合 组合和继承的联合 构造函数和析构函数调用的次序
当一个对象有许多子对象时,了解构造函数和析构函数的调用次序是很有意思的//: C14:Order.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright.txt// ...
2018-07-30 14:11:34 175 1
原创 C++编程思想 第1卷 第14章 继承和组合 组合和继承的联合
组合和继承放在一起使用通过继承和组合两种方法创建一个更复杂的类 //: C14:Combined.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright.txt...
2018-07-30 13:44:19 123
原创 C++编程思想 第1卷 第14章 继承和组合 构造函数的初始化表达式表 在初始化表达式表中的内建类型
构造函数的初始化表达式允许我们显式地调用成员对象的构造函数所有的对象成员在构造函数的左括号之前就被初始化了,这种方法对于程序设计很有帮助为了使语法一致,可以把内建类型看做这样一种类型, 它只有一个取单个参数的构造函数,而这个参数与正在初始化的变量的类型相同 //: C14:PseudoConstructor.cpp// From Thinking in C++, 2nd E...
2018-07-30 13:26:07 126
原创 C++编程思想 第1卷 第14章 继承和组合 继承语法
组合的语法是清晰的,对于继承,则有新的不同的形式当继承时,发现“这个新类很像原来的类”规定:在代码中和原来一样给出该类的名字,但在类的左括号前面,加一个冒号和基类名字 对于多重继承,给出多个基类名,之间用逗号分开//: C14:Inheritance.cpp// From Thinking in C++, 2nd Edition// Available at http://ww...
2018-07-30 13:02:05 127
原创 C++编程思想 第1卷 第14章 继承和组合 组合语法
实际上,我们一直都在用组合创建类,只不过是在用内建数据类型组合新类//: C14:Useful.h// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright.txt// A cl...
2018-07-30 09:45:17 141
原创 C++编程思想 第1卷 第13章 动态对象创建 重载new和delete 定位new和delete
重载operator new()还用其他两个不常见的用途1 我们也许会想在内存的指定位置上放置一个对象。这对于面向硬件的内嵌系统特别重要,在这个系统中,一个对象可能和一个特定的硬件是同义的2 也许会想转在调用new时,能够选择不同的内存分配方案了这两个特性可以用相同的机制实现:重载的operator new()可以带一个或多个参数。最初在调用过程中传递额外的参数给operator ...
2018-07-30 09:34:21 118
原创 C++编程思想 第1卷 第13章 动态对象创建 重载new和delete 构造函数调用
MyType* f = new MyType*调用new分配了一个大小等于MyType类型的内存,然后在那个内存上调用了MyType构造函数。但如果使用了new的内存分配没有成功,会出现什么情况呢?在那种情况下,构造函数不会被调用,所以虽然没能成功地创建对象,但至少没有调用构造函数并传给它一个为0的this指针 //: C13:NoMemory.cpp// From Thin...
2018-07-30 09:23:29 120
原创 C++编程思想 第1卷 第13章 动态对象创建 重载new和delete 为数组重载new和delete
如果为一个类重载了operator new()和operator delete(),无论何时创建这个类的一个对象都将调用这些运算符如果要创建这个类的一个对象数组时,全局operator new()就会被立即调用,用来为这个数组分配足够的内存。可以通过为这个类重载运算符的数组版本,即operator new[]和operator delete,来控制对象数组的内存分配。两个不同的版...
2018-07-30 09:12:18 189
原创 C++编程思想 第1卷 第13章 动态对象创建 重载new和delete 对于一个类操作new和delete
为一个类重载new和delete时,尽管不必显式地使用static,但实际上仍是在创建static成员函数在下面的例子里为Framis一个非常简单的内存分配系统 //: C13:Framis.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce ...
2018-07-30 09:02:08 147
原创 C++编程思想 第1卷 第13章 动态对象创建 重载new和delete
重载全局new和delete当全局版本的new和delete不能满足整个系统时,对其重载是很极端的方法重载的new必须有一个size_t参数operator new()的返回值是一个void*,而不是指向如何特定类型的指针operator delete()的参数是一个指向由operator new()分配的内存的void*重载全局new 和delete //: C13...
2018-07-29 19:31:23 131
原创 C++编程思想 第1卷 第13章 动态对象创建 耗尽内存
当operator new()找不到足够大的连续内存块来安排对象,就会发生什么事情了?一个称为new-handler的特殊函数将会被调用new-hander的默认动作是产生一个异常 throw an exceptin如果我们在程序里用堆分配,至少要用“内存已耗尽”的信息代替new-handler,并异常中断程序想装入的函数地址为参数调用set_new_hander()函数//:...
2018-07-29 18:37:15 108
原创 C++编程思想 第1卷 第13章 动态对象创建 重新设计前面的例子 对指针的清除责任 指针的Stash
Stash的新版本称为PStash,它包含有堆中本来就重载的对象的指针旧的Stash通过传值方式拷贝对象到Stash的容器使用new和delete,控制指向在堆中创建的对象的指针就变得安全、容易了//: C13:PStash.h// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com...
2018-07-29 18:23:43 118
原创 C++编程思想 第1卷 第13章 动态对象创建 重新设计前面的例子 使用delete void*可能会出错
如果想对一个void*类型指针进行delete操作,要注意这可能成为一个程序错误,除非所指的内容是非常简单的,因为,它将不执行析构函数 //: C13:BadVoidPointerDeletion.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce...
2018-07-29 18:02:24 227 1
原创 C++编程思想 第1卷 第13章 动态对象创建 对象创建 一个简单的例子
初始化发生的情况//: C13:Tree.h// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright.txt#ifndef TREE_H#define TREE_H#inc...
2018-07-29 17:53:57 93
原创 C++编程思想 第1卷 第13章 动态对象创建 对象创建 C从堆中获取存储单元的方法
为了在运行时动态分配内存,C在它的标准库函数中提供了一些函数:从堆中申请内存的函数malloc()以及它的变种calloc()和realloc()、释放内存返回给堆的函数free()使用C的动态内存分配函数在堆上创建一个类 //: C13:MallocClass.cpp// From Thinking in C++, 2nd Edition// Available at ht...
2018-07-29 17:37:51 171
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 自动类型转换的缺陷 隐藏的行为
自动类型转换会引入比所希望的更多的潜在行为 //: C12:CopyingVsInitialization2.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright....
2018-07-29 17:25:40 120
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 自动类型转换的缺陷
因为编译器必须选择如何执行类型转换,所以如果没有正确地设计出转换,编译器会产生麻烦类X可以用operator Y()将它本身转换到类Y,这是一个简单且明显的情况。如果类Y有一个单个参数为X的构造函数,这也表示同样的类型转换。现在编译器有两个从X到Y的转换方法,当发生转换时,编译器会产生一个二义性转换错误 //: C12:TypeConversionAmbiguity.cpp...
2018-07-29 17:11:17 336
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 类型转换例子
自动类型转换对于任一含有字符串的类是非常有帮助的两个不用自动类型转换就想从标准的C库函数中使用所有的字符串函数,那么就得为每一个函数写一个对应的成员函数 //: C12:Strings1.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Ec...
2018-07-29 16:47:24 110
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 运算符转换 反身性
使用全局重载运算符而不用成员运算符的最便利的原因之一是在全局版本中的自动类型转换可以针对左右任一操作数,而成员版本必须保证左侧操作数已处于正确的形式。如果想两个操作数都被转换,全局版本可以节省很多代码 //: C12:ReflexivityInOverloading.cpp// From Thinking in C++, 2nd Edition// Available at h...
2018-07-29 16:38:00 120
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 运算符转换
通过运算符重载来自动类型转换可以创建一个成员函数,这个函数通过关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型运算符重载是独特的,没有指定一个返回类型 返回类型是正在重载的运算符的名字 //: C12:OperatorOverloadingConversion.cpp// From Thinking in C++, 2nd Edition// ...
2018-07-28 12:36:35 126
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 构造函数转换 阻止构造函数转换
有时通过构造函数自动转换类型可能出现问题为了避开构造函数自动在前面加关键字explicit 只能用于构造函数 对Two的构造函数进行修改 //: C12:ExplicitKeyword.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Ecke...
2018-07-28 12:11:52 125
原创 C++编程思想 第1卷 第12章 运算符重载 自动类型转换 构造函数转换
如果定义一个构造函数,这个构造函数能把另一类型对象或引用作为它的单个参数,那么这个构造函数允许编译器执行自动类型转换 //: C12:AutomaticTypeConversion.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2...
2018-07-28 11:49:06 118
原创 C++编程思想 第1卷 第12章 运算符重载 重载赋值符 operator=行为 自动创建operator=
因为将一个对象赋给另一个相同类型的对象是大多数人可能做的事情,所以如果没有创建type:operator=(type),编译器将自动创建一个运算符行为模仿自动创建的拷贝构造函数的行为:如果类包含对象 或是从别的类继承的, 对于这些对象, operator=被递归调用。成员赋值 membervise assignment //: C12:AutomaticOperatorEqu...
2018-07-28 11:33:27 170
原创 C++编程思想 第1卷 第12章 运算符重载 重载赋值符 operator=行为 引用计数
拷贝构造函数和operatpr=对指针所指向内容作了一个新的拷贝不止一个对象使用这个Dog,修改自己的Dog时,也等于修改他人的Dog为了解决别名问题, 经常使用另外一个称为写拷贝 copy-on-write的技术在向这块存储单元写之前,应该确信没有其他人使用它如果引用记数大于1,在写之前必须拷贝这块存储单元,这样就不会影响他人了简单的引用计数和写拷贝 //: C12:Re...
2018-07-28 11:18:21 158
原创 C++编程思想 第1卷 第12章 运算符重载 重载赋值符 operator=行为 类中指针
简单地拷贝一个指针意味着以相同的存储单元的对象而结束当做一个赋值运算或一个拷贝构造函数时,最简单的方法是拷贝这个指针所涉及的一切,这非常直接 //: C12:CopyingWithPointers.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bru...
2018-07-28 11:05:43 361
原创 C++编程思想 第1卷 第12章 运算符重载 重载赋值符 operator=行为
当创建一个operator=时,必须从右侧对象中拷贝所有需要的信息到当前的对象 即调用运算符的对象 来完成对类的“赋值”,对于简单的对象,是这样的 //: C12:SimpleAssignment.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce...
2018-07-28 10:48:37 110
原创 C++编程思想 第1卷 第12章 运算符重载 重载赋值符
赋值符常引起C++程序员初学者的混淆‘=’ 在编程中最基本的运算符,在机器层上拷贝寄存器MyType b;MyType a = b;a = b;MyType a = b;定义对象a,一个新对象先前不存在,现在正被创建。C++编译器关于对象初始化会保护,对象被定义的地方构造函数总是被定义。但是调用哪个构造函数呢?a从现有的MyType对象创建 b在等号的右侧,所以只有一个选择:拷...
2018-07-28 09:06:59 132
原创 C++编程思想 第1卷 第12章 运算符重载 非成员运算符
运算符可能是成员运算符或非成员运算符,没有多大差异有时左侧运算符是别的类的对象,通常出现在为输入输出流重载operator<<和>>时 输入输出流是一个基本C++库,我们将有可能想为定义的大部分类重载运算符 //: C12:IostreamOperatorOverloading.cpp// From Thinking in C++, 2nd Editi...
2018-07-28 08:56:55 264
原创 C++编程思想 第1卷 第12章 运算符重载 可重载的运算符 不常用的运算符 operator->*
operator->*是一个二元运算符,其行为与所有其他二元运算符类似operator->*,指向成员的指针间接引用运算符通常同某种代表 灵巧指针 的对象一起使用operator()的函数调用必须是成员函数,它是唯一的允许在它里面有任意个参数的函数要想创建一个operator->*,必须首先创建带有operator()类,这是operator->*将返回对...
2018-07-28 08:42:14 150
深入理解C# 第三版 第二章代码
2018-05-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人