为了理解C++需要记住其主要的次语言,分别为C,Object-Orinted C++(面向对象的C++)、TemplateC++、STL。
· C语言:是C++的基础。C++的块,语句,预处理器,内置数据类型(C++的基本数据类型),数组,指针等等都来自C语言。有些时候也可以认为C++是C语言的某些高级应用,例如:
C语言预定义:
#define PI 3.14
而C++我们多使用:
const double pi=3.14;
而某些时候我们使用C语言的方式编写C++程序解决问题的话就会有局限:C语言没有模板,没有异常,没有重载……
C语言函数:
int func(int m,int n) { return n+m; } int max(int m,int n) { return (m>n)?m:n; }
只能使用int类型数据,但是当我们遇到double的话,就要重新编写函数,大大降低了我们的开发效率。
而使用了C++模板就不一样了,写了模板,往里一套用就可以了。
1 Template T<typename T,typename S,typename R> 2 T func(S m, R n) 3 { 4 return S+R; 5 } 6 Template T<typename T> 7 T max(T m,T n) 8 { 9 return (m>n)?m:n; 10 } 11 #include<iostream> 12 int main(void) 13 { 14 cout<<func<double,double,double>(2.15,3.20)<<endl; 15 cout<<max<double,double>(2.15,3.20)<<endl; 16 return 0; 17 }
· Object-Orinted C++。这部分带C的类(C wtih classes)所诉求的:lasses(包括欧造函数和析构函数)、封装、继承、多态、虚函数(动态绑定)。
· Template上面举了个例子,就不叙述。
· STL是个template程序库。它对容器、迭代器、算法、函数对象有极佳的配合与协调。但是我们使用它的时候要遵守它的规则。
在编程时从以上四个次语言转换时,如果从效率方面考虑,我们就要使用相对应的策略。
对于内置类型(c like)而言:传值比(pass by value)传引用(pass by reference)要高效。
而我们在C++面向对象编程时,因为用户自定义的构造函数和析构函数存在,使用pass-by-reference-to const更好。因为构造对象时,我们并不知道要传入的对象类型是什么,传const引用就可以解决这个问题。
而转到STL的话,pass-by-value再次适用,因为STL中的容器、迭代器是使用C的指针塑造的,此时pass-by-value守则适用。(参见条款20)
请记住:
当我们考虑使用C++高效编程时,使用什么策略和守则,要看我们使用C++哪部分次语言。