c++ 基礎知識(二) 函式
技術標籤:# c++基礎專欄
一、函式的傳遞方式
1、值傳遞
形參是實參的拷貝,改變形參的值並不會改變外面實參的值,從一定的角度來說,值傳遞是單向的---------(實參---》形參),引數的值只能傳入,不能傳出。
應用場景:當函式內部需要修改引數,但是不影響呼叫者時,則用值傳遞。
void Test(int _nValue1, int _nValue2)//值傳遞 { _nValue1 = 10; _nValue2 = 20; cout << "_nValue1:" << _nValue1 << endl; cout << "_nValue2:" << _nValue2 << endl; } int main() { int i = 3, j = 5; Test(i,j); cout << "i:" << i << endl; cout << "j:" << j << endl; system("pause"); return 0; }
執行結果:
2、引用傳遞
形參相當於是實參的“別名”,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的地址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的地址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。
void Test(int &_nValue1, int &_nValue2)//引用傳遞 { _nValue1 = 10; _nValue2 = 20; cout << "_nValue1:" << _nValue1 << endl; cout << "_nValue2:" << _nValue2 << endl; } int main() { int i = 3, j = 5; Test(i,j); cout << "i:" << i << endl; cout << "j:" << j << endl; system("pause"); return 0; }
執行後:
3、指標傳遞
形參為實參的地址指標,當對形參做改變時,也就是對實參做改變。
void Test(int *_nValue1, int *_nValue2)//指標傳遞 { *_nValue1 = 10; *_nValue2 = 20; cout << "_nValue1:" << *_nValue1 << endl; cout << "_nValue2:" << *_nValue2 << endl; } int main() { int i = 3, j = 5; Test(&i,&j); cout << "i:" << i << endl; cout << "j:" << j << endl; system("pause"); return 0; }
執行後:
二、幾種常見函式型別
1、靜態成員函式
我們知道,c++的記憶體儲存通常分為四個區:全域性資料區,程式碼區,棧區,堆區。
全域性資料區:存放全域性變數,靜態成員變數,和常量
程式碼區:存放類成員函式和非類成員函式。
棧區:為函式執行而存在的區域性變數,函式引數,返回地址等。
堆區:除以上之外
按照這個說法,類成員函式是在宣告定義時,放入程式碼區。類的靜態成員變數一開始就放入了全域性資料區。
而類的靜態成員函式和非靜態成員函式都是在類定義的時候放入了程式碼區。那為什麼只有類才有直接呼叫類的靜態成員函式,而非靜態只有類物件能夠呼叫。原因是類的非靜態成員函式其實都含有一個指向類物件的this指標,因而只有類物件才能呼叫。
注意:new出來的只是成員變數,成員函式始終存在,所以如果成員函式未使用任何成員變數的話,不管是不是static的,都能正常工作。需要注意的是,雖然呼叫不同物件的成員函式時都是執行同一段函式程式碼,但是執行結果一般是不相同的。不同的物件使用的是同一個函式程式碼段,它怎麼能夠分別對不同物件中的資料進行操作呢?原來C++為此專門設立了一個名為this的指標,用來指向不同的物件。
2、回撥函式
3、建構函式
拷貝建構函式
4、虛擬函式與純虛擬函式