C++靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員變量(詳解)
其實我們從直觀上可以很好的理解靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員變量這句話因為無論是靜態(tài)成員函數(shù)還是靜態(tài)成員變量,它們
都是在類的范疇之類的,及在類的整個生存周期里始終只能存在一份。然而非靜態(tài)成員變量和非靜態(tài)成員函數(shù)是針對類的對象而言。
然而從本質(zhì)上來說類的靜態(tài)成員函數(shù)的函數(shù)形參中沒有默認的this指針,導致不能調(diào)用具體實例對象的成員。
下面我們來測試一下:
先在靜態(tài)成員函數(shù)中調(diào)用靜態(tài)成員變量:
#include <iostream> using namespace std; class vpoet { public: static int a; int b; public: vpoet(int data) { b=data; } static void statictestfun1() { cout<<"static a="<<a<<endl; } }; int vpoet::a=10; int main() { vpoet *V; V=new vpoet(5); vpoet::statictestfun1(); return 0; }
調(diào)用成功,截圖如下
現(xiàn)在我們再靜態(tài)成員函數(shù)中調(diào)用非靜態(tài)成員變量
#include <iostream> using namespace std; class vpoet { public: static int a; int b; public: vpoet(int data) { b=data; } static void statictestfun1() { cout<<"static b="<<b<<endl; } }; int vpoet::a=10; int main() { vpoet *V; V=new vpoet(5); vpoet::statictestfun1(); return 0; }
編譯下提示了錯誤:
大意是在靜態(tài)成員函數(shù)中引用了類的非靜態(tài)成員變量b。
其實這里可以再深入分析下:
靜態(tài)成員變量的函數(shù)形參中沒有默認的this指針指向類對象本身。所以當我們調(diào)用對象的非靜態(tài)成員變量的時候它不能識別該變量
然而對于靜態(tài)成員變量而言,其存在于整個類中,為每個類對象共有,所以就算沒有默認的this形參仍然可以識別該靜態(tài)成員變量
以上就是小編為大家?guī)淼腃++靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員變量(詳解)全部內(nèi)容了,希望大家多多支持腳本之家~
相關文章
C++產(chǎn)生隨機數(shù)的幾種方法小結(jié)
本文主要介紹了C++產(chǎn)生隨機數(shù)的幾種方法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03