当前位置: 首页 > news >正文

广州网捷网站建设技术有限公司学做网站需要哪几本书

广州网捷网站建设技术有限公司,学做网站需要哪几本书,深圳专业做网站哪家专业,用微信怎么做企业网站面向对象程序设计语言很多#xff0c;如Smalltalk、Ada、Eiffel、Object Pascal、Visual Basic、C等等。C语言最讨人喜欢#xff0c;因为它兼容C 语言#xff0c;并且具备C 语言的性能。近几年#xff0c;一种叫Java 的纯面向对象语言红极一时#xff0c;不少人叫喊着要用… 面向对象程序设计语言很多如Smalltalk、Ada、Eiffel、Object Pascal、Visual Basic、C等等。C语言最讨人喜欢因为它兼容C 语言并且具备C 语言的性能。近几年一种叫Java 的纯面向对象语言红极一时不少人叫喊着要用Java 革C的命。我认为Java 好比是C的外甥虽然不是直接遗传的但也几分象样。外甥在舅舅身上玩耍时洒了一泡尿俩人不该为此而争吵。   关于C程序设计的书藉非常多本章不讲C的语法只讲一些小小的编程道理。如果我能早几年明白这些小道理就可以大大改善数十万行程序的质量了。 1. C面向对象程序设计的重要概念   早期革命影片里有这样一个角色他说“我是党代表我代表党我就是党。”后来他给同志们带来了灾难。   会用C的程序员一定懂得面向对象程序设计吗   不会用C的程序员一定不懂得面向对象程序设计吗   两者都未必。就象坏蛋入党后未必能成为好人好人不入党未必变成坏蛋那样。   我不怕触犯众怒地说句大话“C没有高手C 语言才有高手。”在用C 和C编程8年之后我深深地遗憾自己不是C 语言的高手更遗憾没有人点拨我如何进行面向对象程序设计。我和很多C程序员一样在享用到C语法的好处时便以为自己已经明白了面向对象程序设计。就象挤掉牙膏卖牙膏皮那样真是暴殄天物呀。   人们不懂拼音也会讲普通话如果懂得拼音则会把普通话讲得更好。不懂面向对象程序设计也可以用C编程如果懂得面向对象程序设计则会把C程序编得更好。本节讲述三个非常基础的概念“类与对象”、“继承与组合”、“虚函数与多态”。理解这些概念有助于提高程序的质量特别是提高“可复用性”与“可扩充性”。 1.1 类与对象   对象Object是类Class的一个实例Instance。如果将对象比作房子那么类就是房子的设计图纸。所以面向对象程序设计的重点是类的设计而不是对象的设计。类可以将数据和函数封装在一起其中函数表示了类的行为或称服务。类提供关键字public、protected 和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。   这样可以达到信息隐藏的目的即让类仅仅公开必须要让外界知道的内容而隐藏其它一切内容。我们不可以滥用类的封装功能不要把它当成火锅什么东西都往里扔。   类的设计是以数据为中心还是以行为为中心   主张“以数据为中心”的那一派人关注类的内部数据结构他们习惯上将private 类型的数据写在前面而将public 类型的函数写在后面如表8.1(a)所示。   主张“以行为为中心”的那一派人关注类应该提供什么样的服务和接口他们习惯上将public 类型的函数写在前面而将private 类型的数据写在后面如表8.1(b)所示。   很多C教课书主张在设计类时“以数据为中心”。我坚持并且建议读者在设计类时“以行为为中心”即首先考虑类应该提供什么样的函数。Microsoft 公司的COM 规范的核心是接口设计COM 的接口就相当于类的公有函数[Rogerson 1999]。在程序设计方面咱们不要怀疑Microsoft 公司的风格。   设计孤立的类是比较容易的难的是正确设计基类及其派生类。因为有些程序员搞不清楚“继承”Inheritance、“组合”Composition、“多态” Polymorphism这些概念。 1.2 继承与组合   如果A 是基类B 是A 的派生类那么B 将继承A 的数据和函数。示例程序如下 代码:class A { public: void Func1(void); void Func2(void); }; class B : public A { public: void Func3(void); void Func4(void); }; // Example main() { B b; // B的一个对象 b.Func1(); // B 从A 继承了函数Func1 b.Func2(); // B 从A 继承了函数Func2 b.Func3(); b.Func4(); }这个简单的示例程序说明了一个事实C的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用才要防止乱用“继承”。我们要给“继承”立一些使用规则   一、如果类A 和类B 毫不相关不可以为了使B 的功能更多些而让B 继承A 的功能。   不要觉得“不吃白不吃”让一个好端端的健壮青年无缘无故地吃人参补身体。   二、如果类B 有必要使用A 的功能则要分两种情况考虑   1若在逻辑上B 是A 的“一种”a kind of 则允许B 继承A 的功能。如男人Man是人Human的一种男孩Boy是男人的一种。那么类Man 可以从类Human 派生类Boy 可以从类Man 派生。示例程序如下 代码:class Human { … }; class Man : public Human { … }; class Boy : public Man { … }; 2若在逻辑上A 是B 的“一部分”a part of则不允许B 继承A 的功能而是要用A和其它东西组合出B。例如眼Eye、鼻Nose、口Mouth、耳Ear是头Head的一部分所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成不是派生而成。示例程序如下 代码:class Eye { public: void Look(void); }; class Nose { public: void Smell(void); }; class Mouth { public: void Eat(void); }; class Ear { public: void Listen(void); }; // 正确的设计冗长的程序 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   4BOOL 变量加前缀b如bFlag   5int 变量加前缀i如iWidth   6float 变量加前缀f如fWidth   7double 变量加前缀d如dWidth   8字符串变量加前缀str如strName   9枚举变量加前缀e如eDrawMode   10类的成员变量加前缀m_如m_strName, m_iWidth   对于int, float, double 型的变量如果变量名的含义十分明显则不加前缀避免烦琐。如用于循环的int 型变量i,j,k float 型的三维坐标x,y,z等。 2.2 使用断言   程序一般分为Debug 版本和Release 版本Debug 版本用于内部调试Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏它用于检查“不应该”发生的情况。以下是一个内存复制程序在运行过程中如果assert 的参数为假那么程序就会中止一般地还会出现提示对话说明在什么地方引发了assert。 代码://复制不重叠的内存块 void memcpy(void *pvTo, void *pvFrom, size_t size) { void *pbTo (byte *) pvTo; void *pbFrom (byte *) pvFrom; assert( pvTo ! NULL pvFrom ! NULL ); while(size - - 0 ) *pbTo *pbFrom ; return (pvTo); }  assert 不是一个仓促拼凑起来的宏为了不在程序的Debug 版本和Release 版本引起差别assert 不应该产生任何副作用。所以assert 不是函数而是宏。程序员可以把assert 看成一个在任何系统状态下都可以安全使用的无害测试手段。   很少有比跟踪到程序的断言却不知道该断言的作用更让人沮丧的事了。你化了很多时间不是为了排除错误而只是为了弄清楚这个错误到底是什么。有的时候程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么就很难判断错误是出现在程序中还是出现在断言中。幸运的是这个问题很好解决只要加上清晰的注释即可。这本是显而易见的事情可是很少有程序员这样做。这好比一个人在森林里看到树上钉着一块“危险”的大牌子。但危险到底是什么树要倒有废井有野兽除非告诉人们“危险”是什么否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略甚至被删除。[Maguire 1993]   以下是使用断言的几个原则   1使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别后者是必然存在的并且是一定要作出处理的。   2使用断言对函数的参数进行确认。   3在编写函数时要进行反复的考查并且自问“我打算做哪些假定”一旦确定了的 假定就要使用断言对假定进行检查。   4一般教科书都鼓励程序员们进行防错性的程序设计但要记住这种编程风格会隐瞒错误。当进行防错性编程时如果“不可能发生”的事情的确发生了则要使用断言进行报警。 2.3 new、delete 与指针   在C中操作符new 用于申请内存操作符delete 用于释放内存。在C 语言中函数malloc 用于申请内存函数free 用于释放内 存。由于C兼容C 语言所以new、delete、malloc、free 都有可能一起使用。new 能比malloc 干更多的事它可以申请对象的内存而malloc 不能。C和C 语言中的指针威猛无比用错了会带来灾难。对于一个指针p如果是用new申请的内存则必须用delete 而不能用free 来释放。如果是用malloc 申请的内存则必须用free 而不能用delete 来释放。在用delete 或用free 释放p 所指的内存后应该马上显式地将p 置为NULL以防下次使用p 时发生错误。示例程序如下 代码:void Test(void) { float *p; p new float[100]; if(pNULL) return; …// do something delete p; pNULL; // 良好的编程风格 // 可以继续使用p p new float[500]; if(pNULL) return; …// do something else delete p; pNULL; }  我们还要预防“野指针”“野指针”是指向“垃圾”内存的指针主要成因有两种   1指针没有初始化。   2指针指向已经释放的内存这种情况最让人防不胜防示例程序如下 代码:class A { public: void Func(void){…} }; void Test(void) { A *p; { A a; p a; // 注意a 的生命期 } p-Func(); // p 是“野指针”程序出错 }2.4 使用const   在定义一个常量时const 比#define 更加灵活。用const 定义的常量含有数据类型该常量可以参与逻辑运算。例如 代码:const int LENGTH 100; // LENGTH 是int 类型 const float MAX100; // MAX 是float 类型 #define LENGTH 100 // LENGTH 无类型 #define MAX 100 // MAX 无类型   除了能定义常量外const 还有两个“保护”功能   一、强制保护函数的参数值不发生变化   以下程序中函数f 不会改变输入参数name 的值但是函数g 和h 都有可能改变name的值。 代码:void f(String s); // pass by value void g(String s); // pass by referance void h(String *s); // pass by pointer main() { String name“Dog”; f(name); // name 的值不会改变 g(name); // name 的值可能改变 h(name); // name 的值可能改变 }   对于一个函数而言如果其‘’或‘*’类型的参数只作输入用不作输出用那么应当在该参数前加上const以确保函数的代码不会改变该参数的值如果改变了该参数的值编译器会出现错误警告。因此上述程序中的函数g 和h 应该定义成 代码:void g(const String s); void h(const String *s);   二、强制保护类的成员函数不改变任何数据成员的值   以下程序中类stack 的成员函数Count 仅用于计数为了确保Count 不改变类中的任何数据成员的值应将函数Count 定义成const 类型。 代码:class Stack { public: void push(int elem); void pop(void); int Count(void) const; // const 类型的函数 private: int num; int data[100]; }; int Stack::Count(void) const { num; // 编译错误num 值发生变化 pop(); // 编译错误pop 将改变成员变量的值 return num; }2.5 其它建议   1不要编写一条过分复杂的语句紧凑的C/C 代码并不见到能得到高效率的机器代码却会降低程序的可理解性程序出错误的几率也会提高。   2不要编写集多种功能于一身的函数在函数的返回值中不要将正常值和错误标志混在一起。   3不要将BOOL 值TRUE 和FALSE 对应于1 和0 进行编程。大多数编程语言将FALSE定义为0任何非0 值都是TRUE。Visual C将TRUE 定义为1而Visual Basic 则将TRUE定义为-1。示例程序如下 代码:BOOL flag; … if(flag) { // do something } // 正确的用法 if(flagTRUE) { // do something } // 危险的用法 if(flag1) { // do something } // 危险的用法 if(!flag) { // do something } // 正确的用法 if(flagFALSE) { // do something } // 不合理的用法 if(flag0) { // do something } // 不合理的用法   4小心不要将“ ”写成“”编译器不会自动发现这种错误。   5不要将123 写成0123后者是八进制的数值。   6将自己经常犯的编程错误记录下来制成表格贴在计算机旁边。 3 小结   C/C 程序设计如同少林寺的武功一样博大精深我练了8 年大概只学到二三成。所以无论什么时候都不要觉得自己的编程水平天下第一看到别人好的技术和风格要虚心学习。本章的内容少得可怜就象口渴时只给你一颗杨梅吃你一定不过瘾。我借花献佛推荐一本好书Marshall P. Cline 著的《C FAQs》[Cline 1995]。你看了后一定会赞不绝口。会编写C/C 程序不要因此得意洋洋这只是程序员基本的技能要求而已。如果把系统分析和系统设计比作“战略决策”那么编程充其量只是“战术”。如果指挥官是个大笨蛋士兵再勇敢也会吃败仗。所以我们程序员不要只把眼光盯在程序上要让自己博学多才。我们应该向北京胡同里的小孩们学习他们小小年纪就能指点江山评论世界大事。 转载于:https://blog.51cto.com/foxhack/46072
http://www.zqtcl.cn/news/825229/

相关文章:

  • 网站建设实训个人深圳做营销网站的公司哪家好
  • 广州seo网站策划wordpress关闭主题提示
  • 做门票售卖网站怎么制作自己的水印
  • 网站绑定两个域名怎么做跳转asp 网站后台
  • 百度网站怎么做的赚钱吗郑州资助app下载
  • 成都成华区网站建设天津网站优
  • 大朗网站制作商城网站建设相关费用
  • 付费阅读网站代码搜索引擎推广方式有哪些
  • 企业网站搭建介绍一个电影的网站模板下载
  • wordpress网站插件下载郑州专业网站制作
  • 佛山南海区建网站的公司dw怎么做购物网站
  • 杭州网站关键词排名优化响应式网站好还是自适应网站好
  • 潍坊作风建设网站什么是网站建设技术
  • 网站后台图片不显示东莞市企业招聘信息网
  • 网站发布平台商业网站的网址
  • 免费的培训网站建设门户网站建设管理工作方案
  • 企业网站建设实验感想企业网络推广哪家公司好
  • 网站建设和维护视频如何入侵网站服务器
  • 怎样建设网站空间成都网站设公司
  • 百度文库账号登录入口百度seo规则最新
  • 服务器可以自己的网站吗网络营销策划与创意
  • 广州市招投标网站个人网站可以做论坛
  • 易语言做购物网站春节网站怎么做
  • 建公司网站设计网站公司做网上夫妻去哪个网站
  • 稷山网站建设wordpress单本小说采集
  • 凡客网站规划与建设ppt网站做跳转教程
  • 怎么看网站空间多大做网站旅游销售
  • 天津做手机网站建设旅游网站的目的
  • 飞机查询网站开发的创新点注册公司流程和费用大概多少钱
  • 高质量的邯郸网站建设厦门网页制作厦门小程序app