03 2014 档案

摘要:标题上说“将与参数无关的代码抽离template”,这里的参数既可以指类型,也可以是非类型,我们先来看看非类型的情况。假定我们要为矩阵写一个类,这个矩阵的行列元素个数相等,是一个方阵,因而我们可以对之求逆运算。因为方阵的元素可以有多种类型,同时方阵的维数(方阵大小)也可以不同,像下面这样,我们使用了模板: 1 template 2 class SquareMatrix 3 { 4 public: 5 void Invert(); 6 }; 7 8 int main() 9 {10 SquareMatrix a;11 SquareMatrix b;12 }模板既可以指... 阅读全文
posted @ 2014-03-27 23:53 Jerry19880126 阅读(1276) 评论(0) 推荐(0) 编辑
摘要:背景是这样的,有两个不同的公司,然后想设计一个MessageSender,为这两个公司发送不同的消息,既支持明文发送SendClearText,也支持密文发送SendEncryptedText。一种思路是采用动态绑定的方法,定义一个BasicMessageSender,里面有两个方法,分别是发送明文和密文的虚函数,然后定义它的子类MessageSenderForCompanyA,以及MessageSenderForCompanyB,在这两个子类里面覆盖发送明文和密文的虚函数,从而达到根据不同公司发送不同消息的目的。但这里我们想换一种思路,使用静态多态的方法来实现,静态多态就是模板的技术了,代码 阅读全文
posted @ 2014-03-26 00:00 Jerry19880126 阅读(1182) 评论(0) 推荐(0) 编辑
摘要:顾名思义,typename有双重含意。只要你用过template,那么第一重含意一定知道,那就是声明模板的时候,我们既可以这样写:template 也可以这样写template 这两种写法并没有任何区别,都是标记T可以是符合隐式接口的任何类型,包括系统预定义类型,也包括用户自定义类型。typename的第二重含意其实不大能遇到,因为这个依赖于编译器,看下面的例子: 1 class SampleClass 2 { 3 public: 4 typedef int MyInt; 5 // static const int MyInt = 3; 6 }; 7 8 int main() 9 {... 阅读全文
posted @ 2014-03-24 23:48 Jerry19880126 阅读(2238) 评论(0) 推荐(0) 编辑
摘要:从本条款开始,就进入了全书的第七部分:模板与泛型编程。模板与泛型在C++中是非常重要的部分,还记得本书第一章时,把C++视为一个联邦,它由四个州政府组成,其中一个政府就是模板与泛型了。本条款是一个介绍性质的条款,内容不难,只需要讲清楚两个概念就行了,即什么是隐式接口,什么是编译期多态。隐式接口是相对于函数签名所代码的显式接口而言的。当我们看到一个函数签名(即函数声明),比如说:string GetNameByStudentID(int StudentID);我们就知道这个函数有一个整型的形参,返回值是string。但隐式接口是由有效表达式组成的,考虑一个模板函数,像下面这样:1 templat 阅读全文
posted @ 2014-03-24 00:11 Jerry19880126 阅读(1685) 评论(0) 推荐(1) 编辑
摘要:书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来:先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。下面可以定义一个类,像下面这样:1 class Base2 {3 int. 阅读全文
posted @ 2014-03-22 00:12 Jerry19880126 阅读(43069) 评论(5) 推荐(32) 编辑
摘要:多重继承是一种比较复杂的继承关系,它意味着如果用户想要使用这个类,那么就要对它的父类也了如指掌,所以在项目中会带来可读性的问题,一般我们都会尽量选择用单继承去替代它。使用多重继承过程容易碰到的问题就是名字冲突,像下面这样: 1 class Base1 2 { 3 public: 4 void fun(){} 5 }; 6 7 class Base2 8 { 9 private:10 void fun(){}11 };12 13 class Derived : public Base1, public Base214 {};15 16 int main()17 {18 ... 阅读全文
posted @ 2014-03-18 00:03 Jerry19880126 阅读(1316) 评论(0) 推荐(0) 编辑
摘要:private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡使用复合来进行类的设计。private继承与public的继承是完全不同的,主要体现在两个地方:其一,public继承在子类中保持父类的访问权限,即父类中是public的成员函数或成员变量,在子类中仍是public,对private或者protected的成员函数或成员变量亦是如此;但private继承则不是这样了,它破坏了父类中的访问权限标定,将之都转成private,这对子类本身并无影响(照常 阅读全文
posted @ 2014-03-15 14:50 Jerry19880126 阅读(1876) 评论(1) 推荐(0) 编辑
摘要:如果说public是一种is-a的关系的话,那么复合就是has-a的关系。直观来说,复合就是在一个类中采用其他类的对象作为自身的成员变量,可以举个例子,像下面这样:1 class Person2 {3 private:4 string Name; // 复合string类型的变量5 PhoneNumber HomeNumber; // 复合PhoneNumber对象6 PhoneNumber TelephoneNumber;7 };我们一般会说人有名字,有家庭电话,有手机电话等,但我们一般不会说人是一个名字,或者人是一个家庭电话等。所以在这里,我们并不会去使用publi... 阅读全文
posted @ 2014-03-15 00:11 Jerry19880126 阅读(1302) 评论(0) 推荐(0) 编辑
摘要:先看下面的例子: 1 enum MyColor 2 { 3 RED, 4 GREEN, 5 BLUE, 6 }; 7 8 class Shape 9 {10 public:11 void virtual Draw(MyColor color = RED) const = 0;12 };13 14 class Rectangle: public Shape15 {16 public:17 void Draw(MyColor color = GREEN) const18 {19 cout Draw() = "; // ?38 ... 阅读全文
posted @ 2014-03-13 23:51 Jerry19880126 阅读(1047) 评论(0) 推荐(0) 编辑
摘要:这个条款的内容很简单,见下面的示例: 1 class BaseClass 2 { 3 public: 4 void NonVirtualFunction() 5 { 6 cout NonVirtualFunction(); // 输出BaseClass::NonVirtualFunction25 dp->NonVirtualFunction(); // 输出DerivedClass::NonVirtualFunction26 }从输出结果可以看到一个有趣的现象,那就是两者都是通过相同的对象d调用成员函数NonVirutalFunction,但显示结果却不... 阅读全文
posted @ 2014-03-13 00:03 Jerry19880126 阅读(1167) 评论(0) 推荐(0) 编辑
摘要:举书上的例子,考虑一个virtual函数的应用实例: 1 class GameCharacter 2 { 3 private: 4 int BaseHealth; 5 public: 6 virtual int GetHealthValue() const // 返回游戏人物的血量 7 { 8 return BaseHealth; 9 }10 11 int GetBaseHealth() const12 {13 return BaseHealth;14 }15 };16 17 class KnightBo... 阅读全文
posted @ 2014-03-12 00:09 Jerry19880126 阅读(1450) 评论(0) 推荐(0) 编辑
摘要:这个条款书上内容说的篇幅比较多,但其实思想并不复杂。只要能理解三句话即可,第一句话是:纯虚函数只继承接口;第二句话是:虚函数既继承接口,也提供了一份默认实现;第三句话是:普通函数既继承接口,也强制继承实现。这里假定讨论的成员函数都是public的。这里回顾一下这三类函数,如下:1 class BaseClass2 {3 public:4 void virtual PureVirtualFunction() = 0; // 纯虚函数5 void virtual ImpureVirtualFunction(); // 虚函数6 void CommonFunciton(); ... 阅读全文
posted @ 2014-03-10 23:24 Jerry19880126 阅读(1739) 评论(1) 推荐(3) 编辑