《Essential C++》 Reading Notes

大一上学期学的半本谭浩强算是还给李波了,鹅厂的主流语言是C++,不得不快速把它捡起来。作者Stanley B. Lippman曾在C++之父Bjarne Stroustrup所领导的贝尔实验室里共同研发cfront编译器,同时他也是《C++ Primer》的作者之一,目前就职于动画电影公司Dreamworks。在短短200页的篇幅里,C++的基本语法,面向过程以及面向对象的最最最重要的内容都被阐述的非常清楚,非常适合有一定经验的程序员快速上手C++。

自己对比了一下C++和Java,虽然牺牲了一点性能,但后者的使用友好度确实高于前者。比如随时随地定义与使用方法无需提前声明,默认虚函数,将多重继承转化为单一继承和接口,泛型类和泛型方法的简单定义语法,自动垃圾回收等机制替程序员省了不少事。

Basic C++ Programming

bool, char, short int, int, long int, float, double, long double
命名用下划线
namespace: 避免命名冲突
const: 不再变化
指针先检查再使用
if (ptr && ptr->function())
enum E {A, B, C};
static_cast(object); // 强制类型转换
dynamic_cast(object); // runtime类型转换
typedef existing_type new_name;

Procedural Programming

函数先声明后调用
T &ref = val; // 引用,相当于别名,非0且一定代表某个对象
方法参数拷贝传值,加&为非拷贝直接引用
T *ptr = new T(initial_value); delete ptr;
T *ptr = new T[n]; delete [] ptr;
在函数声明中形参可以设置默认值
static: 局部静态对象(函数返回后依然存在),静态函数通过类就能调用
inline: 直接展开函数提高性能
函数模板(泛型方法)
template T function(T param);
函数指针,直接按名字调用,实现函数式编程
T (*function_ptr)(T)

Object-Based Programming

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class myClass {
public:
myClass(); // 构造函数(constructor)
~myClass(); // 析构函数(destructor)
T function(T param);
T function2(T param) const; // 不改变对象状态
static T function3(T param); // 静态成员函数,通过类直接调用myClass::function3(param);
bool operator==(const myClass&) const; // 运算符重载
private:
string str;
T data;
mutable T data2; // 可变数据成员,用于const函数且不会改变对象实际状态
static T data3; // 静态数据成员,可被同类对象共享
};
T myClass::function(T param)
: str("string") // member initialization list,先于函数体执行
{
data = param;
}

类定义和inline成员函数放在头文件中,非inline成员函数放在程序文件中
this: 调用本函数的对象的指针
friend: 类中声明友元类与友元函数,可以访问private成员
function object: 重载函数调用运算符bool operator()的对象,即可被当作函数来调用
类成员函数指针: T (myClass::*function_ptr)(T)
类模板(泛型类)

1
2
3
template <typename T> class myClass {
myClass2<T> *ptr;
};

类模板成员函数
template <typename T> T myClass<T>::function(T param);
常量表达式作为template参数

1
2
template <int param=1> class myClass {
};

Object-Oriented Programming

1
2
class subClass : public myClass { // subClass继承myClass
};

virtual(虚函数): 子类覆盖超类方法,在runtime动态解析调用超类还是子类的函数
超类中声明virtual,子类中可以不声明virtual,函数定义时不必加virtual
纯虚函数: 抽象类的抽象函数,virtual T function(T param) = 0;
先调用超类构造函数,后调用子类构造函数
先调用子类析构函数,后调用超类析构函数
protected: 可被子类访问
超类对象无法动态解析虚函数,只有超类指针或引用才能动态解析虚函数

Exception Handling

1
2
3
4
5
throw exception_class();
try {
}
catch(exception_class &e) {
}

Standard Template Library (STL)

container

1
2
3
4
5
6
7
8
9
=, ==, !=, empty(), size(), clear()
begin();end();
insert();erase();
push\_back(elem);
pop_back();
push\_front(elem);
pop\_front();
front();back();
container<container<T> > c; // 注意空格

vector - ArrayList

1
2
3
#include <vector>
vector<T> v(size);
vector<T> v(array, array+size);

list - LinkedList

1
2
3
#include <list>
list<T> l(size);
list<T> l(array, array+size);

deque - ArrayDeque

1
2
3
#include <deque>
deque<T> q(size);
deque<T> q(array, array+size);

map

1
2
3
4
5
6
7
#include <map>
map<K, V> m;
m[K] = V;
iter->first; // Key
iter->second; // Value
iter = map.find(Key);
map.count(Key);

set

1
2
3
4
#include <set>
set<T> s;
s.insert(Key);
s.count(Key);

iterator

1
2
container<T>::iterator iter = c.begin()/c.end();
iter++; *iter;

Algorithm

1
2
3
#include <algorithm>
void sort(begin, end);
bool binary\_search(begin, end, elem);

Library

尖括号表示其他目录下的标准头文件,双引号表示本目录下的自定义头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <string>
string str("string”);
str.c_str();
#include <cstdlib>
exit();
#include <functional>
function object adapter: binder, nagator
#include <iterator>
iterator inserter
#include <fstream>
ifstream, ofstream
#include <typeinfo>
typeid(object); // runtime类型鉴定(Run-Time Type Identification)