经常用C++,但是有些细节未必经常会用到。随便翻了翻书,随便拾起了几条细节回忆。
1.构造函数里对成员对象的初始化尽量在初始化列表里,而不要在构造函数里赋值。因为,c++对象的构造分为两步:
1)数据成员的初始化
2)执行被调用构造函数体内的语句。
如上,数据成员初始化时也会调其构造函数,如果没有初始化列表,那么数据成员对象的默认构造函数会被调用一次。OK,这时到了第2步,还会再调用一次赋值操作。这样,对数据成员的初始化做了2此操作,一是缺省构造函数,二是赋值操作。其实如果写在初始化列表里,那么只需要一次构造函数的调用就可以完成。当然如果数据成员是固定的类型,那么两种情况的效率是相当的。
2.区分一下重载,覆盖和隐藏。
重载:函数名相同,参数不同。在相同的作用域里。
覆盖:虚函数override。派生类里的虚函数覆盖基类里的同名同参数虚函数。
隐藏:如果派生类和基类里的函数名相同而参数不同,无论是否虚函数,在派生类里都“看不见”基类里的该函数。如果派生类里的某函数和基类里的某函数名称和参数都相同,而且不是虚函数,那么在派生类里也“看不见”基类里的该函数。
3.内联函数一般是跟在函数的定义而非声明。
如下风格的内联函数不能生效
inline void foo(int x,int y)
void foo(in x,int y)
{
//to do
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
//to do
}
4. 初始化列表中成员列出的顺序和它们在类中声明的顺序相同。和初始化列表里的顺序无关。
5. extern “c”。
extern “C”
{
void foo(int x, int y);
// 其它函数
}
或者写成
extern “C”
{
#include “myheader.h”
// 其它C 头文件
}
这就告诉C++编译译器,函数foo 是个C 连接,应该到库中找名字_foo 而不是找_foo_int_int。C++编译器开发商已经对C 标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件。
6.对于不修改成员变量的函数,都应该定义成const函数。
先看了这些,以后想到再补充。