2020年11月3日 星期二

C++ 在 static 函數內使用本體

當在 class 裏面放置一個 static 函數時, 其實它只算是一個符號聯結, static 的函數實體會搬離到類型之外, 同時它已俱備唯一的函式本體,可以被呼叫, 但無法在 static 函式裏面使用 this 指標, 主因是它已脫離類型的範疇(out of scope), 但可以透過參數傳遞的方式, 利用別名 &變數, 或是指標 * 變數接收類型的本體(instance), 例如:

class  A_new_Class {

      int    aVar = 10;

      int    bVar = 5;

      static   void  function_with_instance(A_new_Class  &this_instance){

         printf("%d\n",  this_instance.aVar);// ok, it's  a parameter of instance's alias

          // printf("%d\n",  *this.aVar); // compile error!  this is invalid

      }

      static   void  function_with_this(A_new_Class  *this_pointer){

         printf("%d\n",  this_pointer -> bVar);// ok, it's a parameter of pointer

        // printf("%d\n",  this -> bVar); // compile error!  this is invalid

      }

    void call_function_with_this( ) {

            function_with_this(this); // call static function to use 'this' pointer

    } 

   void call_function_with_this_instance( ){

           function_with_instance(*this); // call static function to use 'this' instance

  }

      A_new_Class ( ){

          printf("instance of A\n");

      }

} ;


int main( ){

     class a;  // instance of A

     a.function_with_instance(a);// 10

     a.call_function_with_this_instance( );// 10


     a.function_with_this(&a);  // 5

     a.call_function_with_this( );  // 5

}


     

沒有留言:

張貼留言

使用 pcie 轉接器連接 nvme SSD

之前 AM4 主機板使用 pcie ssd, 但主機板故障了沒辦法上網, 只好翻出以前買的 FM2 舊主機板, 想辦法讓老主機復活, 但舊主機板沒有 nvme 的界面, 因此上網買了 pcie 轉接器用來連接 nvme ssd, 遺憾的是 grub2 bootloader 無法識...