写在前面
一般来说, 类的成员函数有三种:
- 非静态成员函数(当然也是非虚函数)
- 静态成员函数
- 虚成员函数
第一种需要 this 指针(通常是在函数的第一个参数位置传入)以联系类对象.
非静态成员函数
#include <cstdio>
class B {
public:
B() {
printf("%s default-ctor\n", __func__);
}
B(const B &) {
printf("%s copy-ctor\n", __func__);
}
B &operator=(const B &) {
printf("%s\n", __func__);
return *this;
}
~B() {
printf("%s\n", __func__);
}
};
class D : public B {
public:
// nothing
};
void t1() {
D d0; // B default-ctor
D d1(d0); // B copy-ctor
D d2; // B default-ctor
d2 = d0; // operator=
// ~B
// ~B
// ~B
}
就算子类不提供这些函数, 默认也会调用这些函数的基类版本
如果子类有了上述这些函数的实现:
class D2 : public B {
public:
D2() {
printf("%s default-ctor\n", __func__);
}
D2(const D2 &) {
printf("%s copy-ctor\n", __func__);
}
D2 &operator=(const D2 &) {
printf("%s D2 \n", __func__);
return *this;
}
~D2() {
printf("%s\n", __func__);
}
};
void t2() {
// 先调用基类版本, 然后是子类版本
D2 d0;
// B default-ctor
// D2 default-ctor
D2 d1(d0);
// B default-ctor
// D2 copy-ctor
D2 d2;
// B default-ctor
// D2 default-ctor
d2 = d0;
// operator= D2
// ~D2
// ~B
// ~D2
// ~B
// ~D2
// ~B
}
静态成员函数
主要特性:
没有 this 指针
, 因为类中的静态成员函数不与任何实例对象绑定在一起, 不需要 this 指针以联系类对象
次要特性:
- 不能直接存取其类中的非静态成员
- 不能够被声明为
const
,volatile
,virtual
- 不需要经过类对象才被调用.
功能
- 作为回调函数
- 在 Pthread 库中应用(需要全局函数), 以静态函数替代之
虚成员函数
为了支持虚函数机制, 需要首先对多态对象有某种形式的执行期类型判别法(RunTime Type Resolution, RTTR)
单一继承下的虚函数
多继承下的虚函数
虚继承下的虚函数
指向成员函数的指针