浅谈c++

  学了一年C++了,积累了一点知识,来分享下。我说的C++是纯C++ISOC++),并不是微软修改过的“托管式”C++

  很多人都说C++很难,很复杂。首先,我必须承认,C++的确复杂,但是并没有想象中的难,最重要的是掌握方法。

1.浅谈C++的学习路线

  看了很多书,发现有许多书都是先介绍面向对象(OO),但是我认为这么做不好,因为C++并不是纯面向对象式的语言。人们常称C为中级语言(或者是终极),为何是中级而不是高级?因为不支持面向对象。

C++向下兼容C,有一说是“C++C的超集,提供了对象层”,“兼容”与“超集”一说,只能针对C++98标准之前而言,如今C/C++都有了11标准,他们的有些新特性不再兼容。

  a.浅谈入门

  学习C++不需要先学C,按斯特劳斯特鲁普大神的话说,最好直接学C++,因为过程式思想必然会对你接受面向对象产生一定影响。在这里推荐一本入门书籍《C++Primer Plus》,这是本很详细的书,但是有个缺点,很多细节感觉作者只是提到了一点,但是并不详细,有种吊胃口的感觉。

  在开始阶段切忌看《C++程序设计语言》,它很难,不要疑惑,C++是个大家伙,没有牢固掌握基础知识之前看这本,完全是浪费时间。入门阶段只要上述一本书即可,要仔细啃,你会发现自己每天在进步。

  b.初识面向对象

  面向对象是很老的东西了,而且直到今天,我一之觉得它被过度包装。说白了,就是在C上再抽象出一层广义的对象层,你可以理解为一种数据结构。很是厌恶用“封装,继承,多态”来概括这种特性,至少个人觉得有点这样形容有点繁琐,甚至是难以理解。我们应该从对象模型来理解。

  封装:每个类只是各种变量和函数的集合体,只是加上了作用域,而且这些作用域依靠public,private,protected来实现accesslevel

  继承:比如A继承子B,那么A对象的空间内除了有自身的变量和函数外还有A的一切,没错,是一切包括private,当然一点需要指出函数并不是存储在对象内      的,它依靠对象地址+偏移+函数地址来实现调用(在这里,我没有区分inline与非inline)

  多态:用基类指针来访问子类的函数,首先要明白指针是怎么回事,关于指针的强转只是改变对象的读取方式,那多态来说,每个对象都有一个vptr,它是一     个三级指针,只想VirtualFunctionTable,此时对于对象指针的修改只是修改vptr能够在vtab内的偏移范围,至于vtab的内部实现,如果感兴趣可以看下      《深度探索C++对象模型》。

  b.复用初瞥

  我在这里主要说的是模板,模板有很多学问,我至今没有完全弄懂,尤其是涉及到模板类的多重继承性问题时,总是会有错误,不过之前好像发现有种情况肯定会出错。我想说的是尽量避免在使用模板类时使用多重继承。模板其实就是将类型模糊化,并且在之后声明时产生代码,替换原先的typename

  2.谈谈我在平时遇到的问题以及一些小窍门

  a. accesslevel很多时候会失效,比如在使用virtual时,基类使用public,子类为private,那么使用多态时,private会失效,我不知道这是不是缺陷,但是可以看出一点,vtab对函数的调用与accesslevel无关。

  b.如果你的类内部无任何变量时,那么sizeof(obj)=1,如果这个类是virtual基类,且它的子类都没有变量,那么就会很有趣了,我们假设这个基类为AB1B2virtualpublic ACpublicB1B2

  这是一个菱形的多重继承,此时cout<<sizeof(objA)<<sizeof(objB1)<<sizeof(objB2)<<sizeof(objC);结果为1448G++4.3)。这就说明虚基类是通过指针实现的。

  c.static内没有this,它并不是只能调用static成员的

  d.protected的继承使用仅对继承类this有效,哪怕是this向上强转,那么protected也会变得像priate一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值