是为每个对象创建的单独函数,还是每个类仅创建一个函数
Are separate functions created for each object or only one per class?
例如,在下面的代码中,是否为每个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 );
随后,您可以传入指向您的Obj1
、Obj2
或Obj3
的指针/引用,以std::function
说到只有一个函数,不要混淆认为它不是线程安全的。 每次调用函数时,变量 k
都有一个单独的局部实例。每次调用函数时,都会在堆栈上新建此局部变量。
相关文章:
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 创建函数变体向量时"No matching function for call"错误
- C++ 在映射中创建函数指针向量
- 以编程方式在 C++ 中创建函数
- 如何创建函数可能使用自定义可比C++?
- 编译错误,未创建函数/方法! 对于 brms 模型
- Cython 创建 C 函数别名
- 创建函数指针数组
- 动态创建函数并获取指针
- 混合模板类型的模板参数包(std::使用可选参数重新创建函数)
- 如何创建函数原型命名空间
- 无法创建函数数组
- 在为STD模板函数创建函数对象时,还要还原样板
- 是否可以在C++中声明基类,以便只能通过创建函数创建从它派生的类
- 将原始指针移动到已创建函数中的下一个字符
- qjsonObject如何创建函数
- 尝试在别人的代码中C++创建函数(A* 搜索)
- 在C++中通过模板包重新创建函数签名和调用
- 创建函数时接收"expected unqualified-id"