收录日期:2020/10/31 00:02:33 时间:2016/07/25 21:21:28 标签:C++ 语言
我是一个大一学生,9月份就要上大二了。
学了C和C++,就我个人看来,觉得没有学到什么,特别是看那些只是比较齐全的书,发觉就C和C++自己就很多都不会的。
很多老师都没有讲,甚至没有提到过,比如说文件流这个东西,我的老师从来不提。

我想知道的是,是不是教材和老师没有要求的,自己就不用掌握那么多,只是大概的了解,或者要自己课后认真的学习?

我的专业是软件工程,读东莞理工学院。对我未来,我想当一名优秀的程序员。我想知道学C和C++的一些内容是否分主次,还是所有的都要了解。

例如我的老师就是坚决反对 friend 和 exit 的。那我是否对这些东西只做大概的了解,而不必深入研究?

我现在必须学好的有哪些东西?


求各位前辈指点!!求各位前辈指点!!求各位前辈指点!!
求各位前辈指点!!求各位前辈指点!!
作为一个大学生不能光靠老师...要懂得自己学习...至于需要看哪些方面的书,论坛上自己找,很多。时间很容易就过的,加油了
要学什么要看你要做什么。
比如你要写个记事本,那肯定要用文件流。
编程这东西,都是靠自学的。
jia you 
我和你是差不多是一届,肯定不算什么前辈,但我想说说我的理解。

  首先不能说我懂了代码怎么用就说会了(当然不是针对你啊= =|),一定要搞懂这些代码为什么会被我们使用,或者说他存在的意义是什么。
  你说“很多老师都没有讲,甚至没有提到过,比如说文件流这个东西,我的老师从来不提。

我想知道的是,是不是教材和老师没有要求的,自己就不用掌握那么多,只是大概的了解,或者要自己课后认真的学习?” 我想说答案肯定是后者!我们已经不是中学生了,大学里,说穿了其实真正学到的最值钱的东西就是我们的自学能力,我们不能要求老师面面俱到,我第一次被老师要求用指针的时候我甚至根本没学过指针!仅仅是知道怎么用,但根本不知道用来干吗,但随着越用越多,总算搞懂指针了,这个时候老师才开始非常系统的讲解指针!
   这才是真正好的教育方式!说那么多屁话干吗?自己做做才是硬道理!
    人家欧美教育都是如此:简单介绍知识点,然后你就去实战吧,等你撞的头破血流,连什么是北都找不到的时候,你才会真正主动的去“深入”这个知识点,等你找到北了,老师再给你来个“浅出”!如此的教育方式造就了学生强大的自学能力和实战能力! 理解概念的最佳途径就是“从实践中来,到实践中去”,不要以为背书上的句子就能理解知识点!
   另外你说的friend!我刚刚学习友元的时候曾经问老师为什么定义友元函数或者友元类这么麻烦,老师回答“因为他根本不希望能你用友元!”而LZ你却说:“那我是否对这些东西只做大概的了解,而不必深入研究?”对此我只能说LZ还是停留在会用代码的阶段,封装是面向对象的一大特征,为什么要封装?你想过没有?封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
   而你用了friend,能同于在封装的类上打穿了一个口子,信息完全外流(对于友元),这可能使得所谓的封装荡然无存了!那么人们将会对你系统是否达到面向对象而产生怀疑! 你定义了一个class,又给他定义了一个friend,那我问你对于这个friend而言,class和struct到底有什么区别? struct是不封装,信息完全外露,而你的这个friend可以完全任意访问任何的private成员,那在你这个friend看来class就是struct!
   我们老师反复强调:定义友元是一个善意的请求,而不是一个强制的命令!没完呢,最好别用,容易破坏软件架构,从功能上来讲很方便!效率高!但从逻辑上来讲很流氓!跟臭名昭著的goto语句不遑多让。
   我们学习c或者c++,一定要学习到它背后的思想!要只是停留在代码上,那在家看书就好啦,了解了基本语法谁不会用?
   我给LZ看看一个编程准则,你自己看看他上面讲的几乎全是和软件架构有关的,LZ如果你看完之后能够对c和c++的“背后”引起重视!

1. 不要用C + +主动重写我们已有的C代码,除非我们需要对它的功能做较大的调整,(也就
是说,不破不立)。用C + +重新编译是很有价值的,因为这可以发现隐藏的错误。把一段运行
得很好的C代码用C + +重写可能是在浪费时间,除非C + +的版本以类的形式提供许多重用的机
会。
2. 要区别类的创建者和类的使用者(客户程序员)。类的使用者才是“顾客”,他们并不需
要或许也不想知道类的内部是怎样运作的。类的创建者必须是设计类和编写类的专家,以使得
被创建的类可以被最没有经验的程序员使用,而且在应用程序中工作良好。库只是在透明的情
况下才会容易使用。
3. 当我们创建一个类时,要尽可能用有意义的名字来命名类。我们的目标应该是使用户接
口要领简单。可以用函数重载和缺省参数来创建一个清楚、易用的接口。
4. 数据隐藏允许我们(类的创建者)将来在不破坏用户代码(代码使用了该类)的情况下
随心所欲地修改代码。为实现这一点,应把对象的成员尽可能定义为private, 而只让接口部分
为p u b l i c,而且总是使用函数而不是数据。只有在迫不得已时才让数据为p u b l i c。如果类的使
用者不需要调用某个函数,就让这个函数成为p r i v a t e。如果类的一部分要让派生类可见,就定
义成p r o t e c t e d,并提供一个函数接口而不是直接暴露数据,这样,实现部分的改变将对派生类
产生最小的影响。
5. 不要陷入分析瘫痪之中。有些东西只有在编程时才能学到并使各种系统正常。C + +有内
建的防火墙,让它们为我们服务。在类或一组类中的错误不会破坏整个系统的完整性。
6. 我们的分析和设计至少要在系统中创建类、它们的公共接口、它们与其他类的关系、特
殊的基类。如果我们的方法产生的东西比这些更多,就应当问问自己,是不是所有的成分在程
序的整个生命期中都是有价值的,如果不是,将会增加我们对它们的维护开销。开发小组的人
都认为不应该维护对他们的产品没有用的东西。许多设计方法并不大奏效,这是事实。
7. 记住软件工程的基本原则:所有的问题都可以通过引进一个额外的间接层来简化
(Andrew Koenig向我解释了这一点)。这是抽象方法的基础,而抽象是面向对象编程的首要
特征。
8. 使类尽可能地原子化。也就是每个类有一个单一、清楚的目的。如果我们的类或我们设
计的系统过于复杂,就应当将所有复杂的类分解成多个简单的类。
9. 从设计的角度,寻找并区分那些变化和不变的成分。也就是在系统中寻找那些修改时不需要重新设计的成分,把它们封装到一个类中。
10. 注意不同点。两个语义上不同的对象可能有同样的操作或反应,自然就会试着把一个
作为另一个的子类以便利用继承性的好处。这就叫差异,但并没有充分的理由来强制这种并不
存在的父子关系。一个好的解决办法是产生一个共同的父类:它包含两个子类——这可能要多
占一点空间,但我们可以从继承中获益,并且可能对这种自然语言的解有一个重要发现。
11. 注意在继承过程中的限制。最清晰的设计是向被继承者加入新的功能,而如果在继承
过程删除了原有功能,而不是加入新功能,那这个设计就值得怀疑了。但这也不是绝对的,如
果我们正在与一个老的类库打交道,对已有的类在子类中进行限制可能更有效,而不必重建一
套类层次来使我们的新类适应新的应用。
12. 不要用子类去扩展基类的功能。如果一个类接口部分很关键的话,应当把它放在基类
中,而不是在继承时加入。如果我们正在用继承来添加成员函数,我们可能应该重新考虑我们
的设计。
13. 一个类一开始时接口部分应尽可能小而精。在类使用过程中,我们会发现需要扩展类
的接口。然而一个类一旦投入使用,我们要想减少接口部分,就会影响那些使用了该类的代码,
但如果我们需要增加函数则不会有影响,一切正常,只需重新编译一下即可。但即使用新的成
员函数取代了原来的功能,也不要去改正原有接口(如果我们愿意的话,可以在低层将两个函
数合并)。如果我们需要对一个已有的函数增加参数,我们可以让原来的参数保持不变,把所
有新参数作为缺省参数,这样不会妨碍对该函数已有的调用。
14. 大声朗读我们的类,确保它们是合理的。读基类时用“is-a”,读成员对象时用“has-a”。
15. 在决定是用继承还是用组合时,问问自己是不是需要向上映射到基类。如果不需要,
就用组合(成员对象)而不用继承。这样可以减少多重继承的可能。如果我们选择继承,用户
会认为他们被假设向上映射。
16. 有时我们为了访问基类中的p r o t e c t e d成员而采用继承。这可能导致一个可察觉的对多
重继承的需求。如果我们不需要向上映射,首先导出一个新类来完成保护成员的访问,然后把
这个新类作为一个成员对象,放在需要用到它的所有对象中去。
17. 一个典型的基类仅仅是它的派生类的一个接口。当我们创建一个基类时,缺省情况下
让成员函数都成为纯虚函数。析构函数也可以是纯虚函数(强制派生类对它重新定义),但记
住要给析构函数一个函数体,因为继承关系中所有的析构函数总是被调用。
18. 当我们在类中放一个虚函数时,让这个类的所有函数都成为虚函数,并在类中定义一
个虚析构函数。当我们要求高效时再把v i r t u a l关键词去掉,这种方法防止了接口的行为出格。
19. 用数据成员表示值的变化,用虚函数表示行为的变化。如果我们发现一个类中有几个
状态变量和几个成员函数,而成员函数在这些变量的作用下改变行为,我们可能要重新设计它,
用子类和虚函数来区分这种不同的作用。
20. 如果我们必须做一些不可移植的事,对这种服务做一个抽象并将它定位在一个类的内
部,这个额外的间接层可防止这种不可移植性影响我们的整个程序。
除了定义二元操作符,别的地方似乎很少用friend
而且还要有什么构造函数的要求,自己研究吧
如果想成为一名优秀的程序员,肯定要深究,为什么不用,而什么地方又需要用
确实有些地方可能将来用不到,但这种捷径是没法预知的,所以还是老老实实都学吧
初学时用文件流来输入测试数据还是很方便的,除非输入的数据量很少或者你能不厌其烦
在学校学到的最重要的还是掌握怎么学和考虑问题的方法。
主就是编程思想,次就是和计算机交流用的语言(c++是英文,易语言是中文)。握好主题,有余力的再细入。
最好的方法是都看一遍,在有了半桶水的能力之下再从头开始看,就知道应该重点掌握的是哪些了。
比如我第一次看C++的书时,补码的表示形式、栈机制的原理、为什么要限定指针、考虑结果溢出、语法什么的都去记,痛苦不堪。看第二遍时那些东西基本都是一掠而过,此时的我更注重的是那些冒泡排序法的核心,递归法的中心思想,这个函数为什么要这么设计啊,分析研究别人考虑问题的方法才是真正有趣、有价值的地方。
喜欢程序的话,可以自己钻研,现在的老师也是当一天和尚撞一天钟的,文件流,异常处理等等老是都不讲的,一个是因为那些比较难,讲了对考试没用,一个是因为可能那些老师自己也不清楚,因为他们很久都没写过超过500行的代码了。
LZ还是自学吧
我建议你从c语言开始学起 看谭浩强的《c程序设计》主要学习数组,指针,结构体 因为他们是难点也很重要
差不多了再去考个计算机二级c语言证书 进一步学习数据结构 我推荐严蔚敏的 很详实 前提一定要有c的基础
接下来 你会爱上编程 自己写点小程序 再学c++ 也是谭浩强的书 让你受益匪浅 主要学类 继承 多态
最后根据你的情况 可以自选门路了 
祝你成功 
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

不要迷信书、考题、老师;
要迷信CPU、编译器、调试器。
老师都是那样。很多老师都是懂得不多的。很多他们自己也许都不清楚。不要迷信老师。一切都得靠自自学。你学不是应付考试,学了学校的教材之后找外国的好书来看吧。还有,实践最重要。要多写代码、、、
不要迷恋老师, 他们连传说都不是! 关键是自学吧
c++的面向对象思想这个难度非常大
很多人学到一定程度就进行不下去了
原因是OOP太深了
完全超出了人的正常思维
我劝你三思
引用 13 楼 xxlovec 的回复:
c++的面向对象思想这个难度非常大
很多人学到一定程度就进行不下去了
原因是OOP太深了
完全超出了人的正常思维
我劝你三思


破后而立
引用 1 楼 xu6148152 的回复:
作为一个大学生不能光靠老师...要懂得自己学习...至于需要看哪些方面的书,论坛上自己找,很多。时间很容易就过的,加油了


谢谢
要有自己的思考,不要老师老师的。
受益匪浅!

来着有分!高分求购买管理信息系统(MIS)毕业论文设计,源码及文章。 文件操作,在线等待 怎样浏览SQL_SERVER中的数据库? 几个问题,急需解决,请大侠不惜赐教 用Profiler时生成的.pbo文件为空怎么办? 这些SQL语句怎么写? 来着有分!高分求购买管理信息系统(MIS)毕业论文设计,源码及文章。 请版主删了此贴! 来着有分!高分求购买管理信息系统(MIS)毕业论文设计,源码及文章。 数据库创建问题,解答出来一定给分 在这种情况下,宽带该如何收费??????????? TomCat经典问题之一-------我的tomcat连接池总是配置不好: 在这种情况下,宽带该如何收费??????????? 如何处理注册表? 请问我用CSocket编程时如何获得数据发送和到达的时间? 在DBGrid1中如何读选中的一条记录? 我与MM第一次约会,她居然叫我去\"开房\",我对她还没有感觉,所以什么都没有做,我是不是好傻呢??? 重新得到焦点后,为什么界面画不出了?[sdk] 请问:错误何在? 问: 什么是调节器,什么是访问器 。 哪里可以下载pet store 请问,如何把.net的帮助文档安装在98下, === 请问,如何绑定DATAGRID和记录集 ? === 哪位大侠做过电力配网自动化系统及电力GIS系统? 帮我看看这段代码 请问Recordset.open , ,x,y,.. 用Open \"LPT1:\" For Output As #1 进行打印,如何使LQ680k打印机退纸? 请问:JBuild 8 不能保存?为什么??? 怎样在控制台中加一个控件,比如说Timer控件,并且写timer的ontimer事件程序 请教高手,我设计一个输入数据的表单的有关问题???在线。。。急急急