是为每个对象创建的单独函数,还是每个类仅创建一个函数

Are separate functions created for each object or only one per class?

本文关键字:创建 函数 一个 单独 对象      更新时间:2023-10-16

例如,在下面的代码中,是否为每个obj1创建了func1()的副本,obj2?还是在他们之间共享func1的单个副本?

class ABC
{
    int a;
    public:
        void  func1(void)
        {
            int k = 9;
            cout << "k = " << k;
        }
};
int main()
{
    ABC Obj1,Obj2;
    ......
    return 0;
}

一个函数用于所有类型的所有对象。

基本上,每个方法只存在一次,就好像你有一个普通的 c 样式函数,并为其提供指针:

    void func1(ABC *this)
    {
        int k = 9;
        cout << "k = " << k;
        this->a = 42;
    }
    ABC obj1;
    func1(&obj1);

只有当您不使用重载继承时,这才是正确的。当使用带有重载的继承时,所谓的 vtable 会发挥作用,但这是另一个教训......

如果你把函数的地址&ABC::func1它将永远是相同的地址。对于ABC的每个实例,它不会有所不同。

请注意,它是指向函数的指针,并且始终指向同一位置。

虚函数具有不同的调度方法,其中每个派生类保存一个表(v-table 或虚拟表),为每个表调用的确切函数。

显示这一点的明显方法是在语言的bind函数中执行此操作:

std::function< void() > = std::bind( &ABC::func1, std::placeholders::_1 );

随后,您可以传入指向您的Obj1Obj2Obj3的指针/引用,以std::function

说到只有一个函数,不要混淆认为它不是线程安全的。 每次调用函数时,变量 k 都有一个单独的局部实例。每次调用函数时,都会在堆栈上新建此局部变量。