在类X的非常量成员函数中,this指针的类型为 X *const .也就是说他是指向非常量X的常量指针。
但是在类X的常量成员函数中,this的类型为const X* const . 这就是常量成员函数和非常量成员函数的区别。
类的非静态数据成员可以被声明为mutable,这将容许她们的值可以被这个类的常量成员函数(也包括非常量成员函数)修改。
如果一个类声明了一个或者多个虚函数,那么编译器会为这个类的每一个对象插入一个指向虚函数表的指针。
如果使用了虚拟继承,对象将会通过嵌入的指针,偏移量或者其他非嵌入的信息来维持对其虚基类自对象位置的跟踪。因此,即使类没有声明虚函数,其中还是有坑被插入了一个虚函数表的指针。
对于一个类X来说,复制构造函数应该被声明为 X (const X &); 而复制赋值操作符应该被声明为X& operator=(const X&) 。
将一个函数的地址初始化或赋值给一个指向函数的指针的时候,无需显式的取得函数地址,编译器知道隐式的获取函数的地址,因此在这种情况下,&操作符是可选的。比如:
void (*fp)(int );
extern void h(int);
fp=h; //OK
fp= &h; //OK
类似的,可以采用如下的方式调用函数:
fp(12); 或者 (*fp)(12);
注意,和void * 指针可以指向任何类型的数据不同,不存在可以指向任何类型函数的通用指针。
还要注意,非静态成员函数的地址不是一个指针,因此不可以将一个函数指针指向一个非静态成员函数。
函数指针的一个传统用途是实现回调。
一个函数指针指向内联函数是合法的。但是如果通过函数指针调用内联函数将不会导致内联函数的调用,因为编译器通常无法在编译阶段确定将会调用什么函数。