1、静态成员函数不可能做到下面两点:1)直接存取非静态成员变量(静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在的,非静态成员当且仅当实例化对象之后才存在,静态成员函数产生在前,非静态成员函数产生在后,故不能访问,内部访问静态成员用::,而访问非静态成员要用this指针,静态成员函数没有this指针,故不能访问。)。2)不可能被声明为const(既然不能直接存取费静态成员变量自然也不能声明为const)。
2、C++设计准则:非静态成员函数至少和非成员函数有着相同的效率。其实成员函数会转化为非成员函数。转化步骤如下:
1)改写函数的原型(signature),安插一个额外的参数到成员函数中,用以提供一个存取通道,使类对象得以将调用该函数,该参数也就是this指针。
2)将成员函数的每一个非静态成员数据的存取操作改变为通过this指针。
3)将成员函数重写成一个外部函数。将函数名称经过“mangling”处理使它在程序中成为独一无二的词汇。
3、名称的特殊处理,一般而言成员的名称前面都会加上类的名称,变得独一无二,除此之外,如果在基类和派生类中定义了先同名称的成员变量,编译器会经过name_mangling,将其改写,比如一个基类Base和派生类Foo都定义了val,那么可能会改写成,val_3Base和val_3Foo。这样不管要处理那哪一个val都可以清晰的指出。成员函数可以重载,所以需要更广泛的name_mangling。
4、声明extern C会压制编译器的非成员函数的name_mangling。
5、目前name_mangling的编码方式并未统一。
6、对于虚函数,使用对象显式调用虚函数和非虚函数决议方式相同,但是使用指针或引用调用其决议方式会发生变化。
A a;
A *p=&a;
p->func();//这个函数为虚函数
//内部会转化为下面的形式,1是虚函数表的索引值,关联到func函数,第二个ptr表示this指针,
(*p->vptr[1])(ptr);
vptr是由编译器产生的指针,指向虚函数表。
7、用指针调用虚函数效率不如直接使用类对象调用,使用类对象调用效率不如使用内联函数。
8、static 类型的成员函数主要特性是它没有this指针,下面的次要特性根源都是这个主要特性:
1)它不能直接存取类中的非静态成员。
2)它不能被声明为const、volatile、或virtual。
3)它不需要类对象才被调用,虽然大部分时间是这样被调用的。
9、如果取一个静态成员函数的地址获得的是其在内存的位置。由于static成员函数没有this指针,所以其地址类型不是一个指向类成员函数的指针,而是一个非成员函数指针。
10、static 成员函数差不多等同于非成员函数,提供了一个意想不到的好处,称为callback函数。可以应用在线程等函数上。

本文探讨了C++中静态成员函数的特性,包括无法访问非静态成员变量和常量,以及C++的设计准则,保证非静态成员函数与非成员函数有相同效率。详细阐述了成员函数转化为非成员函数的过程,以及名称处理如name_mangling的作用。此外,还讨论了虚函数的调用机制、静态成员函数作为回调函数的优势以及它们在内存中的表示形式。

被折叠的 条评论
为什么被折叠?



