云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 林锐文章-修练8年C++面向对象程序设计之体会

林锐文章-修练8年C++面向对象程序设计之体会

  • 62 次阅读
  • 3 次下载
  • 2025/12/12 4:36:42

// 正确的设计,冗长的程序 class Head { public:

void Look(void) { m_eye.Look(); } void Smell(void) { m_nose.Smell(); } void Eat(void) { m_mouth.Eat(); } void Listen(void) { m_ear.Listen(); } private: Eye m_eye; Nose m_nose; Mouth m_mouth; Ear m_ear; };

假如答应Head 从Eye、Nose、Mouth、Ear 派生而成,那么Head 将自动具有Look、Smell、Eat、Listen 这些功能: // 错误的设计

class Head : public Eye, public Nose, public Mouth, public Ear { };

上述程序十分简短并且运行正确,但是这种设计却是错误的。很多程序员经不起“继续”的诱惑而犯下设计错误。

一只公鸡使劲地追打一只刚下了蛋的母鸡,你知道为什么吗? 因为母鸡下了鸭蛋。

本书3.3 节讲过“运行正确”的程序不见得就是高质量的程序,此处就是一个例证。

1.3 虚函数与多态

除了继续外,C++的另一个优良特性是支持多态,即答应将派生类的对象当作基类的对象使用。假如A 是基类,B 和C 是A 的派生类,多态函数Test 的参数是A 的 指针。那么Test 函数可以引用A、B、C 的对象。示例程序如下: class A

{ public:

void Func1(void); };

void Test(A *a) {

a->Func1(); }

class B : public A { ? };

class C : public A { ? };

// Example main() { A a; B b; C c; Test(&a); Test(&b); Test(&c); };

以上程序看不出“多态”有什么价值,加上虚函数和抽象基类后,“多态”的威力就显示出来了。

C++用要害字virtual 来声明一个函数为虚函数,派生类的虚函数将(override)基类对应的虚函数的功能。示例程序如下: class A {

public:

virtual void Func1(void){ cout<< “This is A::Func1 \\n”} };

void Test(A *a) {

a->Func1(); }

class B : public A { public:

virtual void Func1(void){ cout<< “This is B::Func1 \\n”} };

class C : public A { public:

virtual void Func1(void){ cout<< “This is C::Func1 \\n”} };

// Example main() { A a; B b; C c;

Test(&a); // 输出This is A::Func1 Test(&b); // 输出This is B::Func1 Test(&c); // 输出This is C::Func1 };

假如基类A 定义如下: class A { public:

virtual void Func1(void)=0; };

那么函数Func1 叫作纯虚函数,含有纯虚函数的类叫作抽象基类。抽象基类只管定义纯虚函数的形式,具体的功能由派生类实现。 结合“抽象基类”和“多态”有如下突出优点:

(1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。这一

招叫“以不变应万变”,可以大大提高程序的可复用性(这是接口设计的复用,而不是代码实现的复用)。

(2)派生类的功能可以被基类指针引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被将来写的程序调用不足为奇,但是将来写的程序可以被以前写的程序调用那可了不起。

2 良好的编程风格

内功深厚的武林高手出招往往平淡无奇。同理,编程高手也不会用奇门怪招写程序。良好的编程风格是产生高质量程序的前提。 2.1 命名约定

有不少人编程时用拼音给函数或变量命名,这样做并不能说明你很爱国,却会让用此程序的人迷糊(很多南方人不懂拼音,我就不懂)。程序中的英文一般不会太复杂,用词要力求准确。匈牙利命名法是Microsoft 公司倡导的[Maguire 1993],虽然很烦琐,但用习惯了也就成了自然。没有人强迫你采用何种命名法,但有一点应该做到:自己的程序命名必须一致。

以下是我编程时采用的命名约定:

(1)宏定义用大写字母加下划线表示,如MAX_LENGTH;

(2)函数用大写字母开头的单词组合而成,如SetName, GetName ; (3)指针变量加前缀p,如*pNode ; (4)BOOL 变量加前缀b,如bFlag ; (5)int 变量加前缀i,如iWidth ; (6)float 变量加前缀f,如fWidth ; (7)double 变量加前缀d,如dWidth ; (8)字符串变量加前缀str,如strName ; (9)枚举变量加前缀e,如eDrawMode ;

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

// 正确的设计,冗长的程序 class Head { public: void Look(void) { m_eye.Look(); } void Smell(void) { m_nose.Smell(); } void Eat(void) { m_mouth.Eat(); } void Listen(void) { m_ear.Listen(); } private: Eye m_eye; Nose m_nose; Mouth m_mouth; Ear m_ear; }; 假如答应Head 从Eye、Nose、Mouth、Ear 派生而成,那么Head 将自动具有Look、Smell、Eat、Listen 这些功能: // 错误的设计 class Head : publi

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com