【有书共读】《More Effective C++》笔记8
Rule 34如何在同一程序中混合使用C++和C
1.实现混合编程前,确保你的C++编译器和C编译器兼容。
2.将在两种语言下都使用的函数申明为extern 'C'。
[C++支持重载,同一函数名有多个函数,在编译时会对这多个函数加上后缀命名区分;而C语言编译出的是原函数名,当在C++中调用C语言函数时,会“链接”加了后缀命名的C函数,从而出现调用错误;使用extern "C"禁止C++编译时对C函数编译后添加后缀名]
3. C++在main执行前和执行后都有大量代码被执行;尤其是,静态的类对象和定义在全局的、命名空间中的或文件体中的类对象的构造函数通常在main被执行前就被调用,这个过程称为静态初始化;同样,通过静态初始化产生的对象也要在静态析构过程中调用其析构函数;这个过程通常发生在main结束运行之后。而C程序一直把main当作程序的入口。
4.只要程序的任意部分是C++写的,就应该用C++写main()函数;有时看起来用C写main()更有意义--比如程序的大部分是C的,C++部分只是一个支持库。然而,这个C++库很可能含有静态对象(即使现在没有,以后可能会有),所以用C++写main()仍然是个好主意。如果不能用C++写main(),就没有办法确保静态对象的构造和析构函数被调用了。
5.总用delete释放new分配的内存;总用free释放malloc分配的内存。
6.将在两种语言间传递的东西限制在用C编译的数据结构的范围内;这些结构的C++版本可以包含非虚成员函数。
Rule 35让自己习惯使用标准C++语言
1.重定义一个虚函数时,其返回值不需要完全的匹配了(如果原来返回基类对象或指针或引用,派生类可以返回派生类的对象、指针或引用),
2.如果没有一个标准的string类型,那么将血流于街!
3. STL其实非常简单,它只是收集了遵从同样规则的类模板和函数模板;STL的类提供如同begin()和end()这样的函数,这些函数返回类型定义在此类内的选择子对象;STL的算法函数使用选择子对象操作这些类;STL的选择子类似于指针;这就是STL的全部。它没有庞大的继承层次,也没有虚函数,只是影响类模板和函数模板,及它们所遵守的规则。
#笔记#