第一次作业
学习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指针,它不能改变指向。
- int a[2];
- a=new int[2]();
这个将产生编译错误。正确的写法应该是:
- int a[2];
- int *p=a;
- 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便是指针。
浙公网安备 33010602011771号