被误解的C++――学习和使用(二)

2014-11-24 13:03:49 · 作者: · 浏览: 1
元素,_2的占位符对应c2的元素,_1*_2表示才c1的元素乘上c2的元素,其结果放在c3里。表达式可以写得更复杂,比如(_1*_2+3*_1)/(_1-_2)。Lambda表达式可以用在所有需要操作的算法中,比如我要去掉字符串中的“-”,可以这样写:
remove_if(s.begin(), s.end(), _1==’-’);
Lambda表达式基于一种叫做“模板表达式”的技术,通过操作符重载,将一个表达式一层一层地展开,构成一个解析树。然后作为一个函数对象传递给算法,算法在循环内调用函数对象,执行相应的计算。
没有比这更简单的了吧。原理是够复杂的,但我们可以完全不理睬其中复杂的原理,只管用就是了。别看只是一个小小的算法,要知道,再庞大的软件(象JSF的代码有1900万行之多)都是由这些渺小的算法构成的。C++提供的算法和简化算法使用的库几乎对所有的程序算法都有帮助,不仅仅对这种底层算法有效,在更高层次的算法作用更大。
这里我就不再给出C#的代码了,因为C#还不支持Lambda表达式,也无法模拟。如果想要的话,等C#3.0吧。
好了,应该是做小结的时候了。从上面的这些例子可以看出,在最基本的语句上,C#有时比C++简单些,因为C#提供了更多的关键字。但是,随着算法的逐步复杂,C++的抽象能力渐渐发挥作用。一旦需要建立抽象的算法和代码时,C++的泛型编程能力立刻爆发出巨大的能量。最后,我们利用boost::lambda库最大限度简化了算法的使用。更重要的,Lambda表达式的实现极其复杂,但是使用却异常简单。
这便是开头所说的:“C++之所以复杂,是为了使用起来更简单”这句话的含义。C++提供的那些复杂的机制,是为了构建库,以提供语言没有实现的功能,这些功能可以大幅简化开发工作。如标准库里的容器、算法,boost库的Lambda表达式、BGL的命名参数、智能指针等等。
也就是说,一个程序员可以仅仅学习最基本的C++编程技术,便可以利用现成的各种库开发软件。只管用,别问为什么。在这种情况下,学习和使用C++的难度同C#和Java相比没有本质的差别。但由于C++可以提供更灵活高效的库,在不少情况下,反而比C#和Java更好用。
要达到这种程度,程序员所需的训练的确会比C#和Java多一些。所需的训练主要集中在:标准库的使用;区别对象、指针和引用;指针、内存、资源的处理方法,智能指针的使用;类使用的一些特别要点(构造函数、隐式转换等等);多态的正确处理;模板的用法。另外还需要给学习者定下一些“规矩”,避免误用一些敏感的语言机制。这些“规矩”只需遵守,不要问为什么。一旦这些“规矩”成了本能的一部分(强化训练可以达到这种效果),程序员就成熟了。即便回过头使用C#或Java,也能很容易做到趋利避害,扬长避短。(要小心,这时候程序员很可能会骂人的。我是个比较斯文的人,一般不骂人,除了开车的时候和使用C#的时候)。
这些内容只要编排得当,用法标准,学习者不需要花费很长的时间即可掌握,大概两三个月即可,如有半年的时间,便可以纯熟。这样训练出来的程序员基础非常扎实,无论将来学习什么语言或技术,都可以驾轻就熟。如果