C++ 解析 - 函數 Functions

C++ 解析 主目錄
建構元與解構元
虛擬函數
函數

函數
預設引數值 Default Arguments
當呼叫一個函數時, 我們如果省略了某一應傳入之引數, 此時某一事先設定好之值會被自動指派給該一引數, 此一值就叫作預設引數值. 我們需要經由函數原形來設定此一預設引數值, 因為編譯器會解析原形來確認該函數宣告有幾個引數.

例如:
int f(const char *s, int n = 168)
int 是函數傳回值之型別, 168是預設給 n 的值. 如果呼叫此函數時忽略掉 n, 則 n 之值會變成 168, 但如我們傳了一個值進去, 則 168會被該值取代掉.

當函數傳入引數是一個引數串列 (argument list), 則有預設值之引數應先置於該列之右端再依次向左設定:

int func1(int x, int y=1, int z=3);  //正確
int func2(int 1, int y=1, int z);    //錯誤


函數多載 Function Overloading
函數多載讓我們可以使多個函數共用同一個函數名, 此一作法主要是讓這些函數雖然使用不同的引數串列確可以執行同樣的行為.

函數多載的關鍵在於引數串列(又稱為函數簽名 function signature). 當兩個函數的引數串列所含的引數個數, 型別以及排列順序皆相同時, 也就是指它們的簽名相同. C++允許同名之函數存在, 只要它們的簽名有以下之差異:
  • 引數之數量
  • 引數之型別
  • 兩者
某些簽名看起來不同, 但實際上確是視為相同的:

int func(int x);
int func(int &x);

當呼叫此二函數時:

func(m);

引數 m 同時符合 int x 與 int &x 之設定, 編譯器無從判斷兩者之差別. 為了避免模堎兩可之情形, 編譯器會把型別與參考型別視為相同.

另外, 編譯器會把常數與非常數區別為不同:

int func(char *s); //多載
int func(const char *s); //多載

再者, 多載是與簽名有關, 與函數之傳回值無關:

float func(int x, int y); // 非多載
int func(int x, int y);   // 非多載

運算子多載 Operator Overloading
要多載一個運算子, 我們可以使用一個特殊的函數: 運算子函數 (operator function):

operator*(argument_list)

例: 假設我們在 myVector 類別中多載了 operator+() , 而 c1, c2, c3均為 myVector 之一生成物件. 在以下命令列中:

c3 = c1 + c2;

編譯器會辨認出此運算子屬於 myVector 類別, 並會將此命令轉為:

c3 = c1.operator+(c2);


Overloading '='  '+'

class myVector
{
private:
   int x, y;
public:
    myVector() {
    x = 0;
    y = 0;
   }
    myVector(int iX, int iY) {
    x = iX;
    y = iY;
   }
   myVector & operator=(const myVector &);
   myVector operator+(const myVector &);
};

myVector & myVector::operator=(const myVector& c) {
   x = c.x;
   y = c.y;
   return *this;
}

myVector myVector::operator+(const myVector& c) {
   myVector temp;
   temp.x = this->x + c.x;
   temp.y = this->y + c.y;
   return temp;
}

int main()
{
   myVector c1(15, 10);
   myVector c2(20, 50);
   c2 = c1;
   myVector c3 = c1 + c2;
}

不可多載之運算子

以下為不可多載之運算子:

  • . member selection
  • .* member selection with pointer-to-member
  • ?: conditional
  • :: scope resolution
  • # string sizing operator
  • ## merging operator
  • sizeof object size information
  • typeid object type information




C++ 解析 主目錄
建構元與解構元
虛擬函數
函數

1 則留言:

  1. int func1(int x, int y=1, int z=3); //正確
    int func2(int 1, int y=1, int z); //錯誤

    寫錯了.. 應該寫

    int func1(int x, int y=1, int z=3); //正確
    int func2(int x, int y=1, int z); //錯誤

    比較不會被誤解

    回覆刪除