当我们调用object.method()时,C ++ mech如何工作,如何在不与任何其他对象混合的情况下在对象的上下文中调用类的方法。
该对象在该方法中成为“this”对象。
如何管理此映射。我理解当谈到虚函数调用时,你有vptr指针和v-table来定位函数,但它是一个下一级活动。
答案 0 :(得分:3)
在幕后,object.method(1, 2);
等来电正在转换为:class::method(object, 1, 2);
。
基本上,this
有一个“隐藏”参数传递给方法。
答案 1 :(得分:2)
基本上,
class X {
public:
X(int i) : i_(i) {}
void f(int j) {std::cout << i_+j;}
void g(int j) const {std::cout << i_+j;}
private:
int i_;
};
// ...
X* px = new X(42);
px->f(1);
px->g(2);
粗略地翻译成
struct X {
int i_;
};
void X_ctor( X* const this, int i) {this->i_ = i;}
void X_f( X* const this, int j) {std::cout << this->i_+j;}
void X_g(const X* const this, int j) {std::cout << this->i_+j;}
// ...
X* px = allocate_memory(sizeof(X));
X_ctor(px,42);
X_f(px,1);
X_g(px,2);
答案 2 :(得分:1)
对象是对这些成员进行操作的数据成员和函数的集合,或者可以做任何不相关的事情。所以就像一个人可以独立访问任何其他聚合的成员,说它是结构或联合或数组,同样的方式可以访问对象而不混合,隐藏参数“this”对所有成员函数都有魅力。
此外,如果考虑静态类函数,则没有“this”指针,因为它们只能在静态数据成员上操作,而不能在实例变量上操作。
您谈到的vtable机制与使用virtual functions在C ++中实现多态性不同。在某些情况下,除非在代码中使用多态,否则实际上可能不需要虚函数。
答案 3 :(得分:0)
功能指针教程是一个很有用的资源,你可能觉得它很有用和/或有趣:http://www.newty.de/fpt/index.html