首页 > 编程知识 正文

静态函数有this指针吗,在类的非静态函数中this指针指向调用该函数的对象

时间:2023-05-06 03:28:20 阅读:182358 作者:3411

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。 (指针变量访问-成员变量(函数),对象为.) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。