第一篇:C++ 心得
2010.10.13
今天在学习用windows自带的dos命令提示符窗口的命令:
列文件名dir,创建文件夹md(其他文件不能通过该命令创建,即使用了该类文件的后缀名,也只是将该名称和后缀名一块作为了一个新建文件夹的名字,例如md aa.txt的作用是建立一个名为aa.txt的文件夹),删除文件夹下的所有文件del(但是不包括该文件夹下的子文件夹。网上还有人说用deltree可以删除目录树,但是我试了不管用),删除文件夹rmdir或者rd(必须是空的,不能含文件或者文件夹),重命名文件或者文件夹ren x y(将x改名为y,如果是文件则应包括后缀名,如果是文件夹只是名字就可以),移动文件或者文件夹(没找到),复制文件copy a b(a和b可以是文件夹,这时候会复制a中的所有文件但不包括子文件夹到b中,遇到同名文件会询问是否覆盖;如果a和b是文件,则要包括后缀名,而且不只是相同后缀的可以复制,例如两个txt文件,而且非同后缀的文件也可以,例如txt复制到doc文件或者rar文件,这种复制后会连txt的属性一起复制给doc或rar,包括大小和占用空间这两个属性,doc的话还是可以打开,但是rar会损坏掉),创建文本文件copy con A.txt(或者用edit A.txt,区别是前一个会在输完命令后让你再输入文本内容,输完用ctrl+z结束,而后一个会跳出一个类似turbo-c的界面让你输入文字再保存),以树形结构显示出目录tree(用参数-f 将列出第个文件夹中文件名称)。
然后我想解压一个再f盘的压缩文件B,发现在ms-dos里进入B的目录后,直接输入
B.rar或者B.rar /x都会直接打开B,和双击B的效果相同(之前装.NET 3.5 Framework的时候用过这个命令dotnetfx35.exe /x来解压,我想用类似命令解压B的,结果证明不行,上面这个命令应该是只针对.EXE文件有效果,而且不是普通的EXE文件,应该是压缩类的exe文件)。但是我在实验exe文件的时候发现一个有用的办法。平时在有些文件夹里会有一些exe文件,双击之后有些可以运行,但是dos窗口一闪之后就没有了,看不到内容,但是先打开ms-dos,再进入该exe文件目录后输入名称回车则会看到运行内容,并且ms-dos窗口不会关闭。这可以用到C++编程之中。C++编程中,程序运行后有时候也会出现上面的情况,dos窗口一闪而过,看不到运行结果,以前都是直接在程序末尾加入system(”pause”)命令,现在也可以先将程序编译并生成exe文件,再打开MS-DOS,进入exe文件所在文件夹,输入该exe名称的方法来运行,这时候一定可以看到结果。
第二篇:C++编程心得
紧张忙碌的一周过去了,在这个星期里我们小组胜利地将我们选定的课题研究出来,我为我的小组骄傲,也为自己骄傲。
我们的题目是银行定期存款管理系统,在编程过程中,我预订的任务是学习并掌握MFC,并将其运用到我们的程序中。学习MFC的过程是我认为非常痛苦的事,因为完全都是自学,并且因为图书馆中的相关书籍全部被借阅出去,所以没有太多的自学资料,因此虽然费了很大的精力,但仍是无果。经过了很多的小组讨论和自己的心理斗争后最终决定放弃MFC而将自己能力以内的程序尽可能地优化,就这样,我开始在半路阶段加入了程序优化的工作,一遍遍的调试程序,遇到某个攻坚问题,几个人一起在网上查询,一起想解决的办法,就这样,我们团结地将我们现在认为将近完美的程序呈现给老师和同学。
一开始学习MFC时,我总是不能很好的转换思维,不能将自己以前的编程思想和以前的一些不良编程习惯甩掉,因此很多的程序都联系不起来,反而是自己学会了好多的零碎的片面却无法将程序大楼竖起来。在困惑很久后,我选择了询问老师,老师耐心地将MFC的思维方式讲给了我听,这让我受益匪浅,虽然我最后没能将MFC成功的做出来,但我认为我从MFC中才直接地感受到了C++中面向对象编程的封装性。以前用C++编程时总是将类中的变量随便规定属性,甚至在编程的过程中突然需要加一个变量,为了省事直接将其放于public中,在学习了解MFC后,深刻地感受到自己以前的编程习惯是多么的不科学,而那些习惯又是多么的重要。
我们这一次是以团队的形式来做这个项目,并且作为这个小组的组长,我感觉自己的压力很大,因为团队合作不仅讲求整体的团结而且为了团队工作的高效又要有明确的分工。在我们的小组工作中每个人都一刻不放松自己手里的工作,而一些时候我们又配合地很密切,尤其是当我们遇到程序的瓶颈时,我们都是在宿舍里你一句我一句地出谋划策,在遇到一个提取时间的程序时,大家纷纷查询各种辅导书,上网查各种资料,在遇到定期存款支取问题时甚至打电话给家长,寻求“场外支持”,种种的配合都给我们这个部门协调的运作提供了动力。我感谢我的团队,他们让我有一种很舒服的做事情的感觉。
最终决定放弃MFC,我承认自己有一种如释重负的感觉,但是也有一丝惭愧,无论老师要求与否,既然自己决定了就应该走下去,但是我最后退却了,感觉很遗憾也很羞愧,因为我认为对自己降低要求就是放纵自己堕落。
短学期实习,我着实收获了很多,不仅仅是知识上,而且是思考事情方法,我感激这次的实习,也感谢给予我们很多帮助的老师,更感谢我团结的团队。
第三篇:c++课程设心得
C++课程设计心得体会
短学期的课程设计是一次非常珍贵的机会,这是一次可以让我们所学的理论 与实际相结合的机会。我们选择了成绩统计系统这一题目。通过这次比较完整的一个程序的设计,我走出了纯理论的学习,从一种全新的角度去学习。并且在小团队实现的过程中,除去知识的大量更新,我学到了很多东西。
其实个人而言,我体会较深的一点是团队互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到了极大的丰富。同组的同学有着很强的C++实力,在进行编程的过程中,我向她学到了c++的很多知识,交流中也总结出比书本上更精髓生动的语言。在自己琢磨c++各种陌生知识的时候,队友的耐心与任性,对于知识的渴求,对于工作的专注,极大程度上鼓舞了我。我们在交流中,迸发出了很多设计灵感,互相建议改进的过程中,我们分别从各个方面共同改进着,这个已经不能仅仅称作课程设计的作品。从知识获得方面来说,各种已经学习到的C++知识以及各种从网上搜索来的案例,我们都是随着设计的不断深入而不断熟悉的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识,也对自己提出了新的要求。
提高是有限的但提高也是全面的。正是这一次设计让我积累了许多实际经验。也必然会让我在未来的工作学习中表现出更高的耐力、理解力、实践力。顺利如期的完成本次课程设计给了我很大的信心,但是也为我指出很多不足的地方。学习其实就是一个不断完善的过程,正视自己的不足之处。在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断地完善自己。
为期一周不到的MFC课程设计就要这样画上一个句号了。从这不长不短的四周中,我获得了知识,学到了研究的坚持与韧性,这一周不仅仅是交出了一份作业,还对自己有了新的认识。
C++课程设计心得体会
“课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。”在这次课程设计的过程中,我深深地体会到了理论与实践结合的过程,当实践成功时的成就感,从整个过程中我受益匪浅。
从确定了题目,一直到完成整个大作业,在整整一周的日子里,我学到很多的东西。不仅可以巩固了以前所学过的知识,并且发掘了很多在已有的书本上所没有的知识。在设计的过程中遇到问题很平常,从没见过的、没有任何头绪解决的、第一次做的、问题都肯定是难免。而解决这些问题的过程,给我带来了极大的收获。除去知识上的自我完善,同时在设计的过程中发现了自己的不足之处,完善自身的不足,也是这次课程设计给我带来的很大的收获。短学期课程设计我们小组选择了成绩统计系统的题目。在已有的C++知识基础上,大量的MFC新知识只能从书籍和网络中获得,这个过程中,我的自学能力和研究能力得到了极大地提高。通过这次课程设计,我懂得了理论与实际相结合是很重要的,理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,把知识变成自己的,这样才能提高自己的能力。独立思考的能力,学习的能力,动手实践的能力等等。至今我感慨颇多的应当是一些难以查出的错误,编译时查不出的错误,其被发现时很可能只是位置的错误,仅隔数行,这些微小的信息却极大地影响了整体的效果。这不仅存在于一个程序之中,因而我对于生活中的细节也有了改观,对于整体和局部的观念也有了更多的见解。在课程设计过程中,我还感受到了来自于同学小组间交流“头脑风暴”给作品带来的极大改变,向老师及时咨询也为我们的作品带来了极大的帮助。转眼已经是周末,我们的课程设计结束了,但是它留给我的东西恒久有效。不论是已经属于我的知识,还是它带给我的能力,都使我在各个方面得到了自我完善。我们学习的目的就在于实践,这次实践的过程给我带来了极大的收获,将成为我学习生涯中一次独特的经历。
第四篇:一个C++程序员的心得
六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近十个定义。六年后,我从几十万行程序中滚爬出来准备写点心得体会时,却无法解释什么是“面向对象”,就象说不清楚什么是数学那样。软件工程中的时髦术语“面向对象分析”和“面向对象设计”,通常是针对“需求分析”和“系统设计”环节的。“面向对象”有几大学派,就象如来佛、上帝和真主用各自的方式定义了这个世界,并留下一堆经书来解释这个世界。
有些学者建议这样找“对象”:分析一个句子的语法,找出名词和动词,名词就是对象,动词则是对象的方法(即函数)。
当年国民党的文人为了对抗毛泽东的《沁园春·雪》,特意请清朝遗老们写了一些对仗工整的诗,请蒋介石过目。老蒋看了气得大骂:“娘希匹,全都有一股棺材里腐尸的气味。”我看了几千页的软件工程资料,终于发现自己有些“弱智”,无法理解“面向对象”的理论,同时醒悟到“编程是硬道理。”
面向对象程序设计语言很多,如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)这些概念。2回顶部 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 节讲过“运行正确”的程序不见得就是高质量的程序,此处就是一个例证。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)派生类的功能可以被基类指针引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被将来写的程序调用不足为奇,但是将来写的程序可以被以前写的程序调用那可了不起。4回顶部 良好的编程风格
内功深厚的武林高手出招往往平淡无奇。同理,编程高手也不会用奇门怪招写程序。良好的编程风格是产生高质量程序的前提。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)类的成员变量加前缀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)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。5回顶部
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(p==NULL)return;„// do something delete p;p=NULL;// 良好的编程风格 // 可以继续使用p p = new float[500];if(p==NULL)return;„// do something else delete p;p=NULL;}
我们还要预防“野指针”,“野指针”是指向“垃圾”内存的指针,主要成因有两种:
(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 MAX=100;// 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;} 6回顶部 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(flag==TRUE){ // do something } // 危险的用法 if(flag==1){ // do something } // 危险的用法 if(!flag){ // do something } // 正确的用法
if(flag==FALSE){ // do something } // 不合理的用法 if(flag==0){ // do something } // 不合理的用法
(4)小心不要将“= =”写成“=”,编译器不会自动发现这种错误。
(5)不要将123 写成0123,后者是八进制的数值。
(6)将自己经常犯的编程错误记录下来,制成表格贴在计算机旁边。小结
C++/C 程序设计如同少林寺的武功一样博大精深,我练了8 年,大概只学到二三成。所以无论什么时候,都不要觉得自己的编程水平天下第一,看到别人好的技术和风格,要虚心学习。本章的内容少得可怜,就象口渴时只给你一颗杨梅吃,你一定不过瘾。我借花献佛,推荐一本好书:Marshall P.Cline 著的《C++ FAQs》[Cline 1995]。你看了后一定会赞不绝口。会编写C++/C 程序,不要因此得意洋洋,这只是程序员基本的技能要求而已。如果把系统分析和系统设计比作“战略决策”,那么编程充其量只是“战术”。如果指挥官是个大笨蛋,士兵再勇敢也会吃败仗。所以我们程序员不要只把眼光盯在程序上,要让自己博学多才。我们应该向北京胡同里的小孩们学习,他们小小年纪就能指点江山,评论世界大事。
第五篇:北科大暑期C++程序实践心得
北科大小学期C++游戏编程心得
——徐松松 41345053 一直不知道北科大的小学期是什么样子,经过了三周的小学期课程的学习,终于揭开了小学期的神秘面纱,学的课程和平时的理论课不一样,是偏向实践应用方面的,通过这个阶段的学识我确实学到了很多东西。
我对编程比较感兴趣所以选择了C++课程的学习,老师用了两天的时候给我们展示了如何制作游戏的过程,我认真地听讲了,初步了解了funcode软件的使用。后续的一段时间主要是自己做项目,这确实能锻炼自己的独立思考能力,通过对“海底世界”项目的研究,我了解了funcode函数库的一些函数的使用。当然在做“海底世界”这个游戏的时候遇到了很多的困难,客观上有文档的不完整性因素,我会经常去问老师问题,其中主要一个问题是鱼游到边界不返回,和老师一起去查看代码,研究了好些时间。对于“海底世界”的研究为我后续制作的游戏项目奠定了基础。
学习到最多的是在自己制作项目中,文档给我的最基本的代码基本没有什么功能,我在这基础上需要添加好些功能,首先我想到了好些新的功能,有些实现了,有些只是停留在想法,以目前有限的时间和目前的能力,实际完成有些困难,我感觉设计是最主要的,实现是辅助,通过后续课程的学习肯定能够学到更多的实现方法。编程能力的提高主要是靠不断地上机实践获得的,我从初中就开始对编程感兴趣,初中毕业后利用暑假时间和高一的一段时间自学完了C语言,大学学习了C++,也利用课余时间自学完了算法与分析和数据结构这两门课,算是应该是编程稍微有了深入的了解,又通过三周实践项目的练习,对自己的能力又有了一些提高。
由于是个人项目,我付出了较多的心血,每天除了上课上机时间,课后也花费了不少时间,去网上查找实现相关功能的函数代码加以利用,每一个功能的实现都多多少少遇到一些障碍,但都克服了,主要是通过自己一步步调试程序代码,实在不行再去咨询老师,通常是一点即通。我不单单看了“迷你高尔夫”这个游戏,也看了打飞碟的游戏,添加了一些里面的功能,在这个过程,有好多人来问我问题,我都尝试着去解决,不仅帮助了他人,自己也在解决很多问题的过程中得到提高,并且通过交流认识了好几个朋友。
三周的实践过程确实受益匪浅,对前一段C++学习的巩固加深,另外增加了同学之间互相交流的机会,在和老师学生的交流过程中了解到了一些奇特的设计思想,我感觉自己各方面的能力都有了一定程度的提高。