第一次作业

  学习C++有半个多月了,感触比较多。以前一直是和虚拟机类语言(C#/Java)打交道的,尽管早已对C/C++的恶劣环境有所准备,但当开始学习一段时间以后还是不禁吃了一惊。

  本人阅读的是《C++ Primer》,这本书是C++标准委员会许多成员共同著作而成,权威性自然不需多说。书中频繁出现陷阱,注释的小Tip。注释一般是补充解释,提出某些建议或者方案。陷阱的Tip的频繁出现令人惊奇,这大概也是C++被人称作古怪语言的原因。

  废话不多说,上点干货吧:

1.让我想起了Python:

a.字符串分为宽字符串型和普通字符串型。

b.允许在语句中加入\来换行分割显示,编译时会将\忽略掉。

 

2.让我想起了C:

a.#define #if #ifndef #endif这组预处理。 C用它来做DEBUG开关,以及保护.h头。

b.内置类型的长度是与机器相关的。为了保证兼容性,C/C++一般提倡用.h中用typedef声明了一堆的别名来操作。(例如size_t云云的)。

c.整个世界是全局的,源文件之间通过extern来交流。

d.坚决的将变量分为const和非const两种。const相当于将内存上锁,只许访问不许写入。

e.数组变量在通常情况下解释为int指针变量。然而,更恰当的说法(私以为)是数组变量是一个const指针,它不能改变指向。

[cpp]  view plain copy
 
  1. int a[2];  
  2. a=new int[2]();  

这个将产生编译错误。正确的写法应该是:

[cpp]  view plain copy
 
  1. int a[2];  
  2. int *p=a;  
  3. p=new int[3]();  

f.指针横行。与malloc,alloc,free相对应的。C++给出了delete,new,delete []。操作指针目标对象亦可使用->的便捷方式。

 

3.让我想起了Java:

a.#include<>:可不就是类似Java的BootstrapClassLoader,直接从jdk的指定lib文件/目录中查找么?

#include "":就是类似Java的AppClassLoader了,从App路径开始找。

b.vector可是Java中大名鼎鼎的Collections之一。C++标准库中的vector似乎与同步性是无关的。接触了C++模板后似乎开始懂得Java泛型中rawType的意思了。

遗憾的是,C++没有C#/Java中的foreach语法。为了操纵Iterator,不得不写一大堆的域操作符。糟糕的是,域操作符不可避免,因为C++模板并不是一个类。

c.对于比int小的整型来说,在计算前会自动提升为int来进行计算。C++中也是如此。

 

4.让我想起了C#:

a.用using来声明域。using namespace xxx可以在类内直接访问域成员,不需要域操作符::来直接访问。Java/C#/Python访问域均是直接'.'来获得,不知道C++为何如此另类。

b.使用引用。引用便是别名,C#中用ref关键字来指定,C++则用&来指定。

c.const,const <class>*与const *x:在C++中将与指针无关的const理解为#define,将与指针相关的const理解为C#的readonly。

d.操作符重载:也许这真的是个好东西,但是陷阱很多,而且对于新手也并不友好。

e.代理:C++版的delegate便是指针。

 

你可能感兴趣的:(第一次作业)