`
runfeel
  • 浏览: 935649 次
文章分类
社区版块
存档分类
最新评论

关于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容器的时候,这个还是很有意义的。

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

纯粹原创,勿拍砖。

分享到:
评论

相关推荐

    C++高手进阶(Effective C++, STL, Exceptional系列)

    这本书强调了C++中的一些陷阱和常见误解,如初始化而非赋值、利用const进行类型安全、以及何时选择动态分配内存等。通过学习,开发者可以写出更安全、更高效、更易于维护的C++代码。 2. 《C++标准库》:这本书是C++...

    C++入门到精通

    这是我心仪已久的一本书我相信很多...C++语言这是我翻译过程中最为真切的体会它纠正了我过去对于C++语言的一些误解虽 然我从1993 年开始就一直在使用C++ 但是直到阅读了这本书之后我才从真正意义上全面 地认识了C++语言

    c++ issue c++ issue

    8. **文档与注释**:良好的代码文档和注释可以帮助理解和调试代码,减少误解和错误。遵循一定的注释规范,如Doxygen格式,能自动生成文档,提高团队协作效率。 总的来说,解决C++问题需要深入理解语言特性,熟练...

    C++ 程序员成长中最常走的 4 条弯路

    在C++程序员的成长道路上,经常会遇到一些常见的误区和弯路,这些弯路不仅会浪费大量时间,还可能阻碍技能的真正提升。以下是C++程序员在成长过程中最常走的四条弯路,以及如何避免它们。 ### 弯路一:通过MS-VC++ ...

    c++括号匹配问题 c++括号匹配问题

    通过括号,你可以明确指定先进行哪些操作,防止因运算符优先级产生的误解。例如,`a * (b + c)`会先执行括号内的加法,然后进行乘法。 5. **异常处理**: C++的`try-catch`语句中也使用了括号,用于捕获和处理异常...

    C++标准,英文版的C++语言国际标准

    深入学习C++国际标准需要理解其背后的原理和设计哲学,同时结合实践编写代码,通过阅读标准文档,可以更准确地理解和掌握语言的细节,避免因误解而引入的错误。对于有一定基础的C++学习者来说,研读英文版的C++标准...

    绝对经典的C++教程(假的)

    如果这是一个误解,而实际上您需要关于C++编程的知识点,以下是一个基础的C++教程概览: C++是一种强大的、通用的编程语言,由Bjarne Stroustrup在1979年开发,作为C语言的扩展。它支持面向对象编程、泛型编程和...

    Inside the C++ Object Model.pdf

    书中指出了许多关于C++开销和复杂性的误解和神话,同时也明确指出在某些情况下确实存在隐藏的成本和权衡。Lippman解释了各种实现模型是如何产生的,它们可能如何演变,以及它们之所以成为它们的原因。他还探讨了C++...

    C++_图书三人谈

    这种误解可能导致对语言本身特性的忽视。 - **教材评价**:《C++ Primer》虽详尽但过于厚重;《Effective C++》则更适合有一定基础的学习者;《Essential C++》则被认为是较好的入门教材。 - **综合建议**: - 初学...

    effective c++及more effective c++(简体中文chm)

    《Effective C++》和《More Effective C++》是C++编程领域的两本经典著作,由Scott Meyers撰写,旨在帮助开发者深入理解C++语言的精髓,提升编程技巧和效率。这两本书分别包含了55条和35条针对C++编程的最佳实践建议...

    C++之父访谈

    Bjarne对计算机科学的热爱始于高中时期,他误以为计算机科学是数学的一种实用形式,但这个误解却引导他走向了计算机科学的道路,最终创造出了影响深远的C++语言。 C++的形成过程是一个持续创新的过程。在贝尔实验室...

    Exceptional C++[中文] + More Exceptional C++[英文]

    《Exceptional C++》与《More Exceptional C++》是两本非常著名的C++编程书籍,由Stanley B. Lippman所著。这两本书旨在帮助C++开发者深入理解语言的高级特性,提升编程技巧,并避免常见的编程陷阱。 《Exceptional...

    深入C++对象模型(英文版)

    这本书阐述了 C++ 具体是怎么实现的,也澄清了许多人对 C++ 的误解。学习这本书,有助于编写出更加高效的 C++ 程序。如果你想知道 C++ 到底是怎么实现的,想写出更高效的 C++ 程序,这本书绝对不容错过! &lt;br&gt;...

    Asio作者介绍C++中的网络库Networking TS

    这篇文档(P2469r0)是对P2464论文的回应,旨在澄清关于Networking TS(也称为Asio/Net.TS)异步模型的一些误解,并指出它与P2300 Sender/Receiver之间的关系。以下是关键知识点的详细阐述: 1. **执行器(Executor)...

    C++知识点,学习c++

    对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 四、if语句 不要将布尔变量与任何值进行比较,那会很容易出错的。 整形变量必须要有类型相同的值进行比较 浮点变量最好少比点,就算要比也要有值进行...

    C++程序设计陷阱 .

    C++中的运算符重载可以增强代码的表达性,但也会带来误解。错误地重载运算符可能导致逻辑混淆,例如,过度使用赋值运算符(=)重载可能导致无限递归。确保正确理解和使用运算符重载的最佳实践,如左值和右值引用,...

Global site tag (gtag.js) - Google Analytics