例如,在以下代码中,是为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;
}
答案 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 );
然后您可以将Obj1
,Obj2
或Obj3
的指针/引用传递给std::function
说过只有一个函数,不要混淆认为它不是线程安全的。每次调用函数时,变量k
都有一个单独的本地实例。每次调用函数时,都会在堆栈上创建新的局部变量。