深度探索c++对象模型笔记(第四章)成员函数语义学

 
Category: C++

写在前面

一般来说, 类的成员函数有三种:

  1. 非静态成员函数(当然也是非虚函数)
  2. 静态成员函数
  3. 虚成员函数

第一种需要 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 指针以联系类对象

次要特性:

  1. 不能直接存取其类中的非静态成员
  2. 不能够被声明为const, volatile, virtual
  3. 不需要经过类对象才被调用.

功能

  1. 作为回调函数
  2. 在 Pthread 库中应用(需要全局函数), 以静态函数替代之

虚成员函数

为了支持虚函数机制, 需要首先对多态对象有某种形式的执行期类型判别法(RunTime Type Resolution, RTTR)

单一继承下的虚函数

多继承下的虚函数

虚继承下的虚函数

指向成员函数的指针