静态成员函数调用方式--收藏帖子

原帖子地址:https://bbs.csdn.net/topics/390750229

静态成员函数调用方式 
A:: s_fun();//不需要额外传递一个参数,作为this 指针;因为静态函数,属于类,不属于具体对象。
非静态成员函数调用方式 。

非静态成员函数,属于对象,需要隐式传递 this 指针作为参数。

A a;

A &ref=a;

A *ptr = &a;

int main(){

a.fun();   // 1)对象; 传递&a, 即a 的地址作为 fun的 this 指针;

ref.fun();  // 2)引用;传递&ref,也即&a  即a 的地址作为 fun的 this 指针;

ptr->fun();  // 3)指针; 传递 ptr ,也即&a  即a 的地址作为 fun的 this 指针;

return 0;
}

静态成员函数,可以调用非静态成员函数,反之非静态成员函数也可以调用静态成员函数;

在静态成员函数,内部调用非静态成员函数,需要一个额外的对象,这个对象可以是任何可见的,可以访问的全局变量,静态变量(对象,引用,指针对应的对象)
也可以是静态成员函数的参数(通过对象,引用,指针),以及静态函数内部定义的局部变量。

非静态成员函数,可以直接调用静态成员函数。
非静态函数,可以隐式的通过this指针,调用除了构造析构构函数之外的,任何非静态成员函数。
也可以显示的通过this指针,调用除了构造析构构函数之外的,任何非静态成员函数。
可以调用构造函数,构造本类的其他对象。
也可以自动调用析构函数,析构本类的其他对象。
有时候甚至可以显式调用析构函数,析构某些对象。
例如:

a::fun_ather(){}

a:: fun(){

 fun_ather();           //隐式的通过this指针,调用其他非静态成员函数,这是下面式子的省略写法。

 this-> fun_ather();//显示的通过this指针,调用其他非静态成员函数。

}

this 指针,是对象调用函数的时候,隐式传递的。因为形参表,以及实参表里面都没有直接使用this 这个参数;
所以他是隐式的自动传递的;

方式很简单,就是  a.fun(),r.fun(), ptr->fun() ,这种写法的前面那个数据中,对象的地址传递给 this。
编译器安排某种方法,传递这个参数;

例如:VC6~VC10,32Bits 采用ecx 寄存器传递this 指针。

PS
估计,要么是你只看到书中内容的一个片段;
要么是编者,并不是很理解C++静态成员函数,非静态成员函数;

静态成员函数,可以非静态成员函数;反之亦然;
只是调用方式有所不同。
1)类外函数调用成员函数
1.1)其他函数调用成员函数,调用静态成员函数,需要通过类名调用;A:: s_fun();
1.2)其他函数调用成员函数,调用非静态成员函数,通过对象调用; a.fun();r.fun();ptr->fun() ;

2)成员函数的互相调用:

2.1静态成员函数调用静态成员函数,直接用函数名 s_fun();
2.2) 非静态成员函数调用静态成员函数,直接用函数名 s_fun();
2.3非静态成员函数调用非静态成员函数,也可以直接用函数名,fun() ;这是通过this指针来调用的。
2.4)静态调用非静态,由于调用静态函数的代码,没有传递对象相关参数this指针,需要通过其他可以访问的对象来调用。
        a.fun();r.fun();ptr->fun() ;

作为以上所有总结,可以看下面的例子

  class A

{

       int x;

       static A a;

      public:

      void fun(){};

      void fun_other(){};

       static void s_fun();

       static void s_fun(A & ref);

       

  };

     A A::a;

     A a0; 

     void A::s_fun()

    { 

        a.fun();

        a0.fun();

        s_fun(a);

        s_fun(a0);  

    };

      void A::s_fun(A & ref)

    { 

        ref.fun();

        a.fun();

        a0.fun();     

    }

    int main()

    {

         A:;s_fun();

        return 0;

     }

 

你可能感兴趣的:(C++,静态成员函数,调用,非静态成员)