很快c的课程就结束了,开始讲c++,换了一个讲师,等这个讲师出现的时候,我才恍然大悟!我每天坐电梯看着宣传海报上的“五大金牌讲师”那种奇奇怪怪的感觉是什么!原来他们齐刷刷的全是秃顶!而且都很年轻。。。。。。我的天呐~!我以后不会也这样吧!
总结c的课程,我发现我没学到什么新东西,因为他们讲的跟我自己学的差不多,很多东西,你知道语法了跑通例程了也大概明白作用了,但是下来以后还是不知道应该在哪个场景下应用和怎么应用。实际上,并不是人家讲的不够好,而是因为缺乏经验和必要的知识面不能完全领会,师傅领进门修行在个人,培训机构所做的其实就是领你进门,不要指望某一个知识点你能在他这学明白,就算人家给你讲,你也听不懂,比如说指针吧,基本的东西学过以后,在给你讲些高级应用,万能指针void*,这些东西你能听得懂,但是你肯定不知道什么情况下要用这么一种指针?没有类型,那怎么访问数据?我遇到过这些问题,对于指针的真正应用,我也是在后来的学习中领悟出来的,当知识足够充分的时候,把他们串起来,自然就弄明白很多事情了,当指针弄明白以后,对stl里一些东西的理解就又得到升华了,应用起来也就更加游刃有余,学编程应该是这样一个从中间向两边发展的过程,还是那句话,“学编程,要不求甚解!不能一步一个台阶!”
c++是我最想听的,我有很多问题,希望能在这得到些答案,但是结果很遗憾,老师一般会用动物做例子,写个动物的基类,然后写个狗的类继承动物这个基类,在写个猫的类,也继承动物这个基类,在基类里写个cry函数,猫和狗分别重写cry,然后调用后分别cout不同的信息出来。老师也讲了很多很多理论,告诉我们为什么会出现这样的结果以及为什么要这样干,我也明白他说的那个意思,但是,我要用在哪???然后就是多态,同样也搞不明白在什么情况下要用多态特性,搞得我稀里糊涂的,都想要放弃c++了,我就不明白为什么要费半天劲写成类啊!真是累啊~!后来在学习c#和java这种高级语言的时候经常使用面向对象的东西,才渐渐把c++弄明白,现在感觉,学面向对象的话,还是这些高级语言方便些。
c++三大特性,封装,继承,多态。封装很好理解,就比如说我写了个类,我把它弄成一个dll给你用,类里有些函数或变量,我不想被你看到或被你修改了里面的值,因为这些数据可能是保障整个类正常运行的一个关键,这样的数据,就可以用private去声明,但是!!封装,只是在开发阶段,对其他编程人员的一种限定,不要认为它在内存里都是私有的,只是为了让你的代码在访问我的私有数据时,编译不通过而已,事实证明,用指针就可以修改私有成员变量的值。。。
继承其实并不难,语法很简单,原理也不复杂,我个人认为,继承的难点在于,基类或抽象类的设计,这个就需要一些编程之外的知识了。我做过一个地图下载器,用c++写的,功能是提供一个经纬度区间和level,然后从类似谷歌这种web端地图上下载瓦片地图,可以选择下载源,融合了百度、高德、腾讯几家web地图。当时我是这样干的,我先学习了地理坐标系的知识,然后又了解了瓦片地图的概念,在去了解市面上这些地图网站的http请求是什么样的,准备工作完成后,就开始抽象类了,我写了一个MapBase,定义了一些方法,例如,GetRowCell方法,它的功能是下载指定rowcell的瓦片地图,这个抽象类写好了,我写了一个GoogleMap,继承MapBase,重写了一些方法,把google瓦片地图的算法写了进去,我只需要实例化一个GoogleMap,调用重写后的基类方法GetRowCell,就可以下载到地图了。然后,我又写了一个BaiduMap,继承MapBase,重写一些方法,把百度地图的瓦片算法写进去,ok,现在我有了两个地图的算法,都可以进行下载,现在只需要写一个交互页面,用一个控件来切换数据源就行了,那么问题来了,我现在有两种地图算法,简单的处理办法是,我可以把他们的实例都创建出来等待着被调用,设置一个标志变量type,用户切换到谷歌地图的时候type=1,切换到百度地图的时候type=2,但是,如果我在新加一种地图算法的时候,我还地在新加一种type=3,这样很麻烦,此时,多态该出场了!
多态用一句话概括就是,“一个子类对象可以被转换成他的父类类型,然后通过调用父类的方法,最终调用到子类对象重写后的方法”,这是我总结的,这句话什么意思呢,我的MapBase有一个GetRowCell方法,两种地图都有各自的算法,需要他们各自去重写了这个方法,那么就可以把BaiduMap的实例化对象转换成MapBase类型,也就是它的父类,调用GetRowCell时,会使用BaiduMap重写的GetRowCell方法!!那么,在我的地图下载器中,我就可以定义一个MapBase的指针,当用户切换地图源的时候,把BaiduMap的对象或GoogleMap的对象地址赋值给这个父类指针,然后,在点击下载按钮的时候,直接使用这个基类指针的下载方法,如pMapbase->GetRowCell(),这样,实际上就执行了用户选择的地图算法,这就是多态!!
概括总结一下,具有相同属性或方法的类都继承于一个父类,然后各自去实现一些方法的具体行为,最后,可以通过父类类型去调用到每一个子类对象的具体行为,比如,人,猫,狗都是动物,都会喊叫,但是他们喊叫的声音不同,所以各自重写了喊叫的具体行为,那么,作为动物这个类来说,当动物指向人时,调用动物的喊叫方法,实际上发出的是人的声音,因为人重写了这个方法,当动物指向猫的时候,在调用动物的喊叫方法,实际上发出的是猫的叫声。这么看来,继承和多态往往是分不开的。封装呢,就是我在设计猫这个类的时候,把猫设计成四脚站立方式了,当我把猫这个类给你用的时候,我不希望你修改一些数据,不管你是有意的还是无意的,因为这些数据可能导致这个猫变成两条腿站立的,那么,我就把这些数据设计成private访问属性。
面向对象搞懂以后,应用起来还是很爽的!!!