1 .虚拟和静态函数
在c中,不能将静态成员函数声明为virtual函数。
例如,以下程序编译失败。
# includeiostreamclasstest { public ://编译错误: static成员函数为virtual virtual static void fun; 1234567同样,静态成员函数也不能声明为const和volatile。
以下程序也将编译失败。
# includeiostreamclasstest { public ://编译错误: static成员函数可以通过以下方式声明: const static void fun或conststaticintfun{}{return0; };
2 .为什么静态成员函数不是virtual
1 .将此函数标记为virutal没有意义,因为静态成员不属于类对象或类实例。
2. 静态与非静态成员函数之间有一个主要的区别。那就是静态成员函数没有this指针
虚函数通过vptr和vtable来处理。 vptr是一个指针,由类的构造函数生成,只能通过this指针访问。 这是因为它指向vtable,该vtable是类的成员,vptr保存虚函数地址。
静态成员函数没有this指针,所以无法访问vptr。所以静态函数不能为virtual。
虚函数的调用关系:this - vptr - vtable -virtual function
在下面的示例中,如果向类添加虚数函数,则可以看到类的大小会增加4个字节(指针大小)。
class Test
{
公共:
int _m;
(;
Sizeof(test )=4;
添加虚函数后,
class Test
{
公共:
int _m;
virtual void fun (;
(;
Sizeof(test )=8
3 .为什么静态成员函数不能成为const函数
将非静态成员函数声明为const会影响this指针。 对于Test类的const限定成员函数,this指针相当于Test const;对于非const成员函数,this指针相当于Test。
另一方面,使用const限定静态成员函数没有意义,因为静态成员函数没有this指针。
volatile的道理也一样。
4 .静态成员函数只能访问静态成员变量-静态成员函数没有this指针
5 .静态成员可以独立访问。 这意味着无需创建对象实例即可访问。 -静态成员函数不属于任何对象,而是属于类。
this指针精典回答:
没办法的白云进入房子后,
可以看到桌子、椅子、地板等
但是,房子看不到全貌了。
在一个类的实例中,使用、
成员函数、成员变量、
但是实例本身呢?
this是一个指针,它总是指向你这个实例本身。
个人理解:
(PS :类class类似于这所房子。 this很像钥匙。 用钥匙打开这个房子的门后,里面的东西请随便拿走。
this是实例化对象本身的指针,包含对象本身的地址,可以访问内部成员函数和成员变量。
为什么需要this? 因为this范围位于类内部,所以当您自己声明类时,还不知道实例化对象的名称,所以您将使用this本身的对象变量。 在非静态成员函数中,编译器会在编译时添加this作为隐式参数,并通过this访问单个成员(即使没有写this指针)。 例如,等效于a.fun(1)===fun(a,1 )
使用this )在类的非静态成员函数中返回对象本身时,常用于直接使用return *this的()操作符重载、赋值和复制等函数。
2 )传递的函数的形式如果参与成员变量名称相同(例如,this-n=n (不能写为n=n ) ) ) ) ) ) ) ) )。
示例程序:
类点
{
int x,y;
公共:
点(int b,int b ) )。
{ x=a; y=b; }
voidmovepoint(inta,int b ) )。
{ x=a; y=b; }
Void print () )
{ cout'x='; }
}
void main () )
{
pointpoint1(10,10 );
point1.移动点(2,2 );
point1.print (;
}
1 .对象point1调用move point (2,2 )时,即point1对象的地址传递给this指针,如数组
名称与数组中第一个元素的地址相同。
2 .编译器编译后的原型应为voidmovepoint(point*this,int a,int b )
3 .在函数体中,{this-x =a; this-y =b; () ) ) ) )。
point1.x =a; 点1.y=b。 (指针变量访问-成员变量(函数),对象为.) )。