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

时间:2014-01-13 10:31:57

标签: c++ oop

例如,在以下代码中,是为func1()obj1创建的obj2副本?或者是func1在他们之间共享的单个副本?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

基本上,每个方法只存在一次,就好像你有一个给出指针的普通c风格函数一样:

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

    ABC obj1;
    func1(&obj1);

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

答案 2 :(得分:0)

如果您使用函数&ABC::func1的地址,它将始终是相同的地址。每个ABC实例都没有什么不同。

请注意,它是一个指向函数的指针,它总是指向同一个地方。

虚函数具有不同的调度方法,其中每个派生类都包含一个表(v表或虚拟表),以确定每个派生函数的确切函数。

显示此功能的显而易见的方法是使用语言bind功能,您可以执行此操作:

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

然后您可以将Obj1Obj2Obj3的指针/引用传递给std::function

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