关于C++的一些误解

好久没有在这里写东西了,总是忙于各种各样的事情,呵呵,在下载MSYS的功夫写点东西吧。

看到论坛里的一篇文章,上面说“C++何尝不是被误解最多的语言呢”?实在是无比的赞同。经过一天的思考,想了很多东西,写出来分享一下。

误解一:我学C了,学了好久,可以学C++了吧?

事实上,无数的文章说到,C++和C没有什么关系,但是无数的人,甚至于这里的老师在强调学C++肯定要先学C,究竟孰对孰错呢?

我想,强调学C++之前要学C的老师,肯定是先会了C,然后再遇到C++的人。(这也没办法,C毕竟比C++早了10年吧)相对于我来说,我大一的上学期直接学C++,大一下学期因为一个机器人比赛,必须用C,才用的C,所以可能走过的路不一样看法就不一样。

C++的语法兼容C的语法的一个子集,这是最中肯的说法,也是他们现在的唯一关系。要知道java,C#在一定程度上也是兼容C语法的子集的,为什么没人说学C了会了,就会C#了呢?额,也许有人这么说吧。。C写的程序,用C++编译器编译不一定会通过,因为C++具有更严格的类型检查。同样的代码,用C和C++编译,生成的二进制文件,也绝对不同。甚至简简单单的for循环,都有差别。

当然,这些都是“术”上的问题,最严重的问题,应该是思想问题。

C语言接触不多,所以没有什么可说的,就说我当时写机器人时候强迫必须用C的代码吧。

大部分的代码都是形如下述这样的:

Code:
  1. typedefstructtagSomeStruct
  2. {
  3. intdata1;
  4. }SomeStruct;
  5. voidSS_SetData1(SomeStruct*this,intvalue);

很懂C的同学应该觉得这些代码很怪异,但是这就是思维方式的不同了。如果你精通C,写起来C++的代码,也会有说不出的怪异的。所以,我觉得,如果你想学C,过度到C++,倒不如直接学C++来的爽快。

误解二:我精通VC++

VC++,或者MFC,可以说是各种GUI类库里,最不面向对象的一个了,也是实现的最不C++的一个了。

VC6.0可以说是各种现在还在用的C++编译器中,最不标准也最不被别的编译器兼容的一个了。。

上面两句话,可能会激起民愤,但是确实是事实。首先说第二个吧,那个比较好说,因为微软自己也承认。事实上,VC6.0不兼容的编译器,包括它的后续版本,VC2003,05,08,2010。连厂商都选择不继续兼容了,为什么还有这么多人抱着不放呢?

MFC的问题也很神奇。呵呵,曾经听说有人把MFC称作Mother F*UCKING Class。说的偏激,也不失公允。具体的说法,可以参看这个文章:http://wenku.baidu.com/view/5582fb0e76c66137ee061977.html

有一篇文章说到,不要相信任何一个精通C++的人。 我想说,那就更不要说精通VC++的人了。你只是在使用微软提供的一个产品而言,和C++基本上没有更多关系,甚至MFC中不鼓励标准库的使用,完全与C++的想法背道而驰。 哪天微软不再支持,哪里还有什么VC++? 甚至,我觉得这一天并不遥远。 为什么VC6使用范围这么广,很大程度上是VS的后续版本对C++支持的并不很好。

另外,更为重要的问题是,写程序绝对不是调API。。。曾经在群里有人说win32 api是程序员的必备能力,然后说每天背多少个api。。。。。何其囧也~~~别的就不多说了,相信论坛里的兄弟们有这个能力分辨什么是写程序,什么不是。

误解三、C++是带有类的C

虽然C++曾经有这个名字,但是为什么改名字呢?

因为C++增加的绝对不仅仅是类。更好的类型检查,命名空间,模板元编程,RTTI。这些都是C++所增加的东西。 要知道,C#和java的模板均是借鉴自C++的,RTTI也在一定程度上完成了反射(当然,只是完成了一部分,不过有很多类库完成了反射,比如Qt)。至于模板元编程,也是很有意思的一个方面。

看看下面的程序,计算Fibonacci数列的第N项:

Code:
  1. #include<iostream>
  2. usingnamespacestd;
  3. template<intN>
  4. structFib
  5. {
  6. enum{Result=Fib<N-1>::Result+Fib<N-2>::Result};
  7. };
  8. template<>
  9. structFib<1>
  10. {
  11. enum{Result=1};
  12. };
  13. template<>
  14. structFib<0>
  15. {
  16. enum{Result=0};
  17. };
  18. intmain()
  19. {
  20. cout<<Fib<25>::Result<<endl;
  21. return0;
  22. }

这个程序可是纯静态的计算哦,不占用运行时时间。

虽然,这种模板元编程,并不经常使用(数学库还是会用到的,快啊),但是,至少在ADT容器的时候,这个还是很有意义的。

好了,就到这里吧,还有很多很多要说的,不过看看反响先。。。

纯粹原创,勿拍砖。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值