侯捷老师《C++及标准库》课程培训 记录

这周一至周三(2013.07.22-2013.07.24)三天时间,有幸参加到侯捷老师的《C++及标准库》课程培训,不仅加深了对C++的理解,了解了STL的许多细节,而且重温了大学课堂的生活,十分高兴。感谢公司给予这样宝贵的机会,感谢侯捷老师的精彩课程,更加感谢他创作,翻译了这么多优秀书籍,为广大国内程序员指点迷津,授业解惑。

这次课程面向的是初级程序员,所以有些知识点在大学中已经接触到,但温故而知新也不失为一件乐事。以下是我对于这三天课程的一些知识点总结。

1.this指针以及相关行为:成员函数调用、const修饰符修饰函数。

2.函数重载:返回值、传值传引用等不同会造成二义性。

3.inline function :写在.h文件中的函数,就像用inline修饰的函数一样,不一定就是内联的,最后还是要由编译器决定。

4.传值、传引用区别

5.初始化参数列表:写在初始化参数列表中的成员变量是直接以参数构造的,在构造函数中赋值则是先以默认构造函数构造出对象后再赋值。

6.Big 3:成员变量是指针,动态分配内存时,复制构造函数、赋值操作符、析构函数三者都要做相应的内存操作。

7.复制构造函数、赋值操作符 要check self assignment。

8.placement new:调用构造函数的方法,注意构造函数的各个版本都会调用父类以及成员变量的构造函数,在构造函数中调用构造函数会产生多次构造。

9.指定调用父类某个版本的构造函数:通过初始化参数列表实现。

10.delete this:这个操作平常比较少使用,但也能在MFC、Boost等库的源代码中看到。

11.explicit: 构造函数如果不用explicit关键字修饰,会被隐式调用。这个行为可能会与转换操作符产生二义性。

12.new 会在内存块头产生cookies,记录这块空间的大小。

13.delete与delete[]:用new分配的对象数组,用delete也会完整释放整块空间(cookies的作用),但只会调用一次析构函数,应该用delete[]确保数组内每个对象的析构都被调用到。

14.操作符重载的两种方式:内部重载(member function)与外部重载(global function)

15.static 修饰:成员变量、成员函数以及在模板类中的使用。

16.::operator new与::operator delete是全局函数,可被重载

17.类关系:继承(Inheritance) 、组合(Composition)、协作(Delegation)

18.虚函数:虚指针、虚表

19.szieof(*basepointer)返回basetype的大小,无论basepointer指向什么。(sizeof不是函数、在编译期求值)

20.通过对象调用虚函数是静态绑定,通过指针或引用调用虚函数是动态绑定。

21.多继承情况下,如果父类们都有虚函数,会有多个虚指针指向不同的虚表。

22.让base class 拥有虚析构函数:让派生类定义的析构函数有机会执行。

23.模板类可指定特定类型,进行偏特化定义。

24.STL六大组件:Container,Algorithm,Functor,Iterator,Adapter,Allocator

25.泛化编程中,行为(Algorithm)与数据(Container)无关。Iterator是Container与Algorithm之间沟通的桥梁。

26.Allocator:可自己定义内存分配细节(memory pool)

27.vector:空间连续,resize会重新分配空间,调用复制构造函数,析构函数,销毁原对象。

28.slist(Forward_List):单向链表,元素会多一个指针。

29.list:双向环形,元素会多两个指针。

30.deque:分段连续存储,支持跳跃访问,访问速度比vector略慢一点点,但不会重新分配空间导致对象重新构造、析构。

31.stack:默认底层是deque,可以是vector或者list。

32.queue:默认底层是deque,可以是list,但不能用vector,因为vector不支持push_front。

33.rb_tree:红黑树模板类,用户指定的key和data(我们常说value)组成一个value。使用时要提供key、value、keyofvalue(从value中取key的functor)、compare(如何比较两个key的functor)和allocator(有默认)。

34.map、set(multimap、multiset):基于rb_tree,map、set不允许key重复(底层调rb_tree::insert_qual());multimap、multiset,特性与用法与map、set一致,只是底层调用rb_tree::insert_unique(),允许key重复。

35.hashtable:与rb_tree一样要提供key、value、keyofvalue、compare、allocator,还要提供一个hashfunction。底层的buckets是一个vector,当插入总量大于buckets的size时,扩展大约两倍大小,全部元素rehashing。

36.可自行拓展template<class key>hash的偏特化,满足需求。格式:

__STL_TEMPLATE_NULL struct hash<char>
{
size_t operator()(char x) const {return x;}
}

37.hash_set,hash_map(hash_multiset,hash_multimap):基于hashtable的set、map,不具有元素自动排序特性,在C++11中改名为unorder_set,unorder_map,unorder_multiset,unorder_multimap。

38.functor adapter,函数适配器,拓展函数行为,例如:count_if(vi.begin(), vi.end(), notl(bind2nd(less<int>(), 12)));中的bind2nd, notl。

39.C++11的若干新特性:auto,lambda,范围for,不定参template,Tuples,std::Array等等。

Tagged . Bookmark the permalink.

发表评论

邮箱地址不会被公开。