视C++为一个语言联邦
与其说C++是具有一些规范约束的一体语言,不如说C++是一些次语言组成的联邦政府,每个次语言都有自己的规
约,C++的高效编程就是建立在这些次语言上的,取决于你使用C++的哪一部分。也就是说,当你使用不同的part
of C++时,高效编程的方式是不同的。
为了理解C++,你必须认识其主要的次语言,幸运的是总共只有4个:
C
C++仍是以C为基础,并兼容了C的语法。但当你以C++的C成分工作时,高效编程守则映照出C语言的局限性:没有
异常,没有重载,没有模板。
Object-Oriented C++
包括类、封装、继承、多态等面向对象编程特性。
Template C++
C++的泛型编程部分
STL
这是个Template程序库。它将容器、迭代器、算法以及函数对象的规约有极佳的紧密配合与协调。
当你从某个次语言切换到另一个时,高效编程的方法可能会发生改变。比如说,在C中,传值一般比传引用要高效。
而在Object-Oriented C++中就不是这样了,因为对象传值的话会执行相应的构造函数和析构函数,这时传引用就会
比传值要高效了。
举例说明Object-Oriented C++中传引用的高效性。
#include <iostream>
using namespace std;
class A {
public:
A() {
cout<<"dafault constructor"<<endl;
}
A(A &a) {
cout << "copy constructor"<<endl;
}
~A() {
cout << "distructor"<<endl;
}
void print() {
cout << "this is A"<<endl;
}
};
void test(A a) {
a.print();
}
int main() {
A a;
test(a);
cout<<"end"<<endl;
}
传值 结果为:
若改为传引用结果为:
void test(A &a) {
a.print();
}
还可以看到在传值时,析构函数调用了两次,如果写成这样
#include <iostream>
#include <cstring>
using namespace std;
class A {
char *r;
public:
A(char *b) {
int n = strlen(b);
r = new char[n + 1];
memcpy(r, b, sizeof b);
}
void print() {
cout << r << endl;
}
~A() {
delete[] r;
}
};
void test(A a) {
a.print();
}
int main() {
char b[] = "abc";
A a(b);
test(a);
return 0;
}
则会两次调用delete [ ] r 导致内存问题。
因此
当你使用不同的part ofC++时,高效编程的方式是不同的。当你从某个次语言切换到另一个时,高效编程的方法也
可能会发生改变。C++的高效编程守则视状况而变化,取决于你使用C++的哪一个部分。