C++函數帶默認值的幾種情形


1. 默認參數的規則

  • 默認值定義

C++支持函數參數帶默認值。這里所謂的默認值,指的是在調用函數時,可以不指定某些參數,編譯器會自動把默認值傳遞到函數調用中。

  • 默認值位置

指定默認值的參數必須位於形參列表最右端,從右往左。否則會出現二義性,編譯器無法處理。

  • 默認值設置

默認值可以在函數聲明或函數定義中設置,只要保證不出現參數重定義即可。

2.默認參數示例

  • 在函數聲明中設置默認值

這是最常見的一種情形。主要有以下兩種聲明方式:

  1. 聲明中給參數賦默認值
  2. 聲明中用類型指定默認值
float area(float radius = 5.0);

int main()
{
  float s1 = area();
  float s2 = area(6.0);

  return 0;
}
float area(float = 5.0);

int main()
{
  float s1 = area();
  float s2 = area(6.0);

  return 0;
}

以上兩種方式是等價的。

  • 在函數定義中設置默認值

如果函數直接在調用前定義,此時不需要函數聲明,則默認參數可以在函數定義中直接設置。

float area(float r = 5.0)
{
  return r * r *3.14;
}

int main()
{
  float s = area();

  return 0;
}

3.注意事項

  • 默認值設置位置

不管是在聲明還是在定義中設置默認值,都要確保以下兩點:

  1. 函數在調用時,能獲取到設置的默認值
  2. 默認值不存在重復設置

若不滿足以上兩個條件,編譯時會報錯無法通過。

float area(float r)
{
  return r * r * 3.14;
}

int main()
{
  float area(float = 5.0);

  float s1 = area();
  float s2 = area(6.0);

  return 0;
}

上面的代碼是可以正常運行的,原因是在函數調用之前,聲明中設置了參數的默認值,即main函數中如下語句:

float area(float = 5.0);

編譯器在調用函數前檢測到參數默認值,能夠正常完成調用。

float area(float r = 5.0);

float area(float r = 5.0)
{
  return r * r * 3.14;
}

以上代碼會編譯不過,原因是編譯器檢測到默認參數有重定義。

  • 默認值與函數重載

函數默認值不能和函數重載形成二義性,否則編譯器無法判斷具體使用的是那個函數。如以下代碼,函數調用存在二義性,編譯不通過。

float func1(float r1, float r2 = 5.0);
float func1(float r);

float func1(float r)
{
  return r * r * 3.14;
}

float func1(float r1, float r2)
{
  return r1 * r1 * 3.14;
}

int main()
{
  float s2 = func1(6.0);

  return 0;
}
  • 默認值的類型

默認值可以是常量、全局變量或者全局函數。不可以是局部變量。原因是函數參數默認值是在編譯時確定的,而局部變量存在棧上,編譯時不能確定。

float globalRadius = 7.0;

float gen(float magic)
{
  return magic;
}

float func1(float r)
{
  return r * r * 3.14;
}

int main()
{
  float func1(float r = globalRadius); //全局變量做默認值,OK
  float func1(float r = gen(1.0)); //全局函數做默認值,OK
  float val = 1.0;
  float func1(float r = val); //局部變量做默認值,編譯不通過

  float s2 = func1();

  return 0;
}
  • 參數是引用時的默認值

若參數是引用,不能直接將實際值設為默認值。可以將全局變量作為引用參數默認值

float globalRadius = 7.0;

float func1(float &r)
{
  return r * r * 3.14;
}

int main()
{
  float func1(float &r = 1.0); //不能將常量值設為引用參數默認值,編譯不過
  float func1(float &r = globalRadius); //OK

  float s2 = func1();

  return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM