1. 程式人生 > >C和C++中的形參預設值

C和C++中的形參預設值

C__帶預設值引數的函式說明

1.float area(float r=6.5);

指定r的預設值為6.5,如果在呼叫此函式時,確認r的值為6.5,則可以不必給出實參的值,如
area( );                              //相當於area(6.5);
如果不想使形參取此預設值,則通過實參另行給出。如area(7.5);                           //形參得到的值為7.5,而不是6.5
這種方法比較靈活,可以簡化程式設計,提高執行效率。

2.如果有多個形參,可以使每個形參有一個預設值,也可以只對一部分形參指定預設值,另一部分形參不指定預設值。

如有一個求圓柱體體積的函式,形參h代表圓柱體的高,r為圓柱體半徑。函式原型如下:

float volume(float h,float r=12.5);          //只對形參r指定預設值12.5
函式呼叫可以採用以下形式:
volume(45.6);                                //相當於volume(45.6,12.5)
volume(34.2,10.4)                            //h的值為34.2,r的值為10.4

3.實參與形參的結合是從左至右順序進行的。因此指定預設值的引數必須放在形參表列中的最右端,否則出錯

例如:

void f1(float a,int b=0,int c,char d=′a′);     //不正確
void f2(float a,int c,int b=0, char d=′a′);     //正確
如果呼叫上面的f2函式,可以採取下面的形式:
f2(3.5, 5, 3, ′x′)                  //形參的值全部從實參得到
f2(3.5, 5, 3)                      //最後一個形參的值取預設值′a′
f2(3.5, 5)                         //最後兩個形參的值取預設值,b=0,d=′a′
        可以看到,在呼叫有預設引數的函式時,實參的個數可以與形參的個數不同,實參未給定的,從形參的預設值得到值
。利用這一特性,可以使函式的使用更加靈活。例如例4.7求2個數或3個數中的最大數。也可以不用過載函式,而改用帶有預設引數的函式。
例4.8 求2個或3個正整數中的最大數,用帶有預設引數的函式實現。
#include <iostream>

using namespace std;

int max(int a, int b, int c=0);//函式宣告,形參c有預設值

int main( )
{
int a,b,c;
 cin>>a>>b>>c;
 cout<<″max(a,b,c)=″<<max(a,b,c)<<endl;   //輸出3個數中的最大者
 cout<<″max(a,b)=″<<max(a,b)<<endl;       //輸出2個數中的最大者
 return 0;
}
int max(int a,int b,int c)        //函式定義

{

 if(b>a) a=b;

 if(c>a) a=c;
 return a;
}
執行情況如下:
14  -56  135↙
max(a,b,c)=135
max(a,b)=14
在使用帶有預設引數的函式時有兩點要注意:
(1) 如果函式的定義在函式呼叫之前,則應在函式定義中給出預設值。如果函式的定義在函式呼叫之後,則在函式呼叫之前需     要有函式宣告,此時必須在函式宣告中給出預設值,在函式定義時可以不給出預設值(如例4.8)

(2) 一個函式不能既作為過載函式,又作為有預設引數的函式。因為當呼叫函式時如果少寫一個引數,系統無法判定是利用過載函式      還是利用預設引數的函式,出現二義性,系統無法執行。

(3) 在函式宣告和函式定義中,預設引數必須相同。這是錯的,因為定義時有實參,但是宣告的時候沒有實參的話那麼定義的時候           的實參沒有用,等於沒有提供實參!!

C++__帶預設值引數的函式說明

          我們可以賦予函式引數預設值。所謂預設值就是在呼叫時,可以不寫某些引數的值,編譯器會自動把預設值傳遞給呼叫語句中。預設值可以在宣告或定義中設定;也可在宣告或定義時都設定,都設定時要求預設值是相同的。

  關於預設值要注意幾點:

(1) .若在定義時而不是在宣告時置預設值,那麼函式定義一定要在函式的呼叫之前。因為宣告時已經給編譯器一個該函式的嚮導,所      以只在定義時設預設值時,編譯器只有檢查到定義時才知道函式使用了預設值。若先呼叫後定義,在呼叫時編譯器並不知道哪個      引數設了預設值。所以我們通常是將預設值的設定放在宣告中而不是定義中。
(2) .不能將實際值傳遞給引用型別的引數。可以將變數作引用型別引數的預設值,這時變數必須是已經宣告且是全域性變數。
      宣告函式時,要將類或結構中定義 的靜態成員變數作為預設值,若該類或結構還未建立例項,那要在此靜態成員變數前加上作用       域操作符(::)。
     若已聲明瞭類或結構的例項,則引用其成員變數作為函式引數的預設值,就要在變數前加上例項名和成員操作符(.)。
(3) .若給某一引數設定了預設值,那麼在引數表中其後所有的引數都必須也設定預設值,否則,由於函式呼叫時可不列出已設定預設       值的引數,編譯器無法判斷在呼叫時是否有引數遺漏。(實參和形參是從左向右結合的)
(4) .在呼叫時,若給已經設定預設值的引數傳遞實際值,既要取代預設值,則在引數表中被取代引數的左邊所定義的所有引數,無論       是否有預設值,都必須傳遞實際引數。
      這也是因為函式呼叫時可不列出已設定預設值的引數。假若被取代引數的左邊既有設定了預設值的引數也有未設定預設值的參           數,若不對其左邊的所有引數傳遞實際引數,編譯器也就無法分辨傳遞的這個取代值到底要傳遞給哪個引數。
  例如有以下函式宣告:
  int FunctionOne(int x,int y=0,int z=0,int w=0);
  我們要給z 傳遞整型值8,作如下呼叫:
  FunctionOne(8);
  顯然,編譯器無法確定這個8 到底要傳遞給哪個引數。為了達到我們的目的,必須這樣呼叫:
  FunctionOne(0,0,8);
  這是x 被傳遞了0,y 被傳遞了 0,z 被傳遞了8

*******************************************************************************************

第九節 預設引數的函式

1.預設引數的目的
  C++可以給函式定義預設引數值。通常,呼叫函式時,要為函式的每個引數給定對應的實參。例如:
    void delay(int loops); //函式宣告
    void delay(int loops) //函式定義
    {
     if(100ps==0)
      return;
      for(int i=0;i<loops,i++);
    }

  無論何時呼叫delay()函式,都必須給loops傳一個值以確定時間。但有時需要用相同的實參反覆呼叫delay()函式。C++可以給引數定義預設值。如果將delay( )函式中的loops定義成預設值1000, 只需簡單地把函式宣告改為:
    void delay(int loops=1000); 
  這樣,無論何時呼叫delay()函式,都不用給loops賦值,程式會自動將它當作值1000進行處理。例如,呼叫:
    delay(2500); //loops設定為2500
    delay(); //ok:loops採用預設值1000

  呼叫中,若不給出引數,則按指定的預設值進行工作。
  允許函式預設引數值,是為了讓程式設計簡單,讓編譯器做更多的檢查錯誤工作。

2.預設引數的宣告
  預設引數在函式宣告中提供,當又有宣告又有定義時,定義中不允許預設引數。如果函式只有定義,則預設引數才可出現在函式定義中。例如:
    void point(int=3,int=4); //宣告中給出預設值
    void point(intx,inty) //定義中不允許再給出預設值
    {
     cout <<x<<endl;
     cout <<y<<endl;
    }


3.預設引數的順序規定

  如果一個函式中有多個預設引數,則形參分佈中,預設引數應從右至左逐漸定義。當呼叫函式時,只能向左匹配引數。例如:
    void func(int a=1,int b,int c=3, int d=4); //error
    void func(int a, int b=2,int c=3,int d=4); //ok

  對於第2個函式宣告,其呼叫的方法規定為:

    func(10,15,20,30); //ok:呼叫時給出所有實參
    func(); //error:引數a沒有預設值
    func(2,12); //ok:引數c和d預設
    func(2,15,20); //error:只能從右到左順序匹配預設 (這好像有異議)


4.預設引數與函式過載

  預設引數可將一系列簡單的過載函式合成為一個。例如, 下面3個過載函式:
    void point(int,int){//...}
    void point(int a){return point(a,4);}
    void point(){return point(3,4);}

  可以用下面的預設引數的函式來替代:
    void point(int=3,int=4);
  當呼叫“point();”時,即呼叫“point(3,4);” 它是第3個宣告的過載函式。
  當呼叫“point(6);”時,即呼叫“point(6,4);”,它是第2個宣告的過載函式。
  當呼叫“point(7,8);”時,即呼叫第1個宣告的過載函式
  如果一組過載函式(可能帶有預設引數)都允許相同實參個數的呼叫,將會引起呼叫的二義性。例如:
    void func(int); //過載函式之一
    void func(int,int=4); //過載函式之二,帶有預設引數
    void func(int=3,int=4); //過載函式之三,帶有預設引數

    func(7); //error: 到底呼叫3個過載函式中的哪個?
    func(20,30) //error:到底呼叫後面2個過載函式的哪個?


5.預設值的限定

  預設值可以是全域性變數、全域性常量,甚至是一個函式。例如:
    int a=1;
    int fun(int);
    int g(int x;fun(a)); //ok:允許預設值為函式

  預設值不可以是區域性變數,因為預設引數的函式呼叫是在編譯時確定的,而區域性變數的位置與值在編譯時均無法確定。例如:
    void fun()
    {
     int i;
     void g(int x=i); //error:處理g()函式宣告時,i不可見
    }

本章小結

  隨著程式量和程式複雜度的不斷增加,最好的辦法是把程式分成更小,更容易管理的模組,這種模組就是函式。
  函式名最好能反映出所要完成的任務。
  函式可以把資料返回給呼叫者,若函式要返回一個值,必須在函式名前規定返回值的型別,若函式沒有返回值,則型別為void。
  程式通過引數把資訊傳遞給函式,若函式需要接受引數,就必須給引數指定名稱及型別。
  C++必須知道函式的返回型別以及接受的引數個數和型別, 如果函式的定義出現在函式呼叫之後,就必須在程式的開始部分用函式原型進行宣告。
  區域性變數是在函式內部定義的,只能被定義該變數的函式訪問。全域性變數是指其作用域貫穿程式始終的變數。定義全域性變數要在程式開始時進行,並且放在所有函式的外面。
  靜態區域性變數是在函式內部定義,但生命期卻隨函式的第一次被呼叫而產生, 隨程式的結束而結束, 靜態區域性變數只能在定義該變數的函式中可見。
  函式呼叫機制是由棧操作的過程實現的。函式可以遞迴呼叫。函式定義不能放在任何函式定義的裡面。
  行內函數是為了提高程式設計效率而實現的, 它克服了用#define巨集定義所帶來的弊病。
  函式過載允許用同一個函式名定義多個函式。連線程式會根據傳遞給函式的引數數目、型別和順序呼叫相應的函式。函式過載使程式設計簡單化,程式設計師只要記住一個函式名,就可以完成一系列相關的任務。
  在函式定義中通過賦值運算,即可指定預設引數值。一旦程式在呼叫函式時默認了引數值, 函式就使用預設引數值。 不允許在引數中間使用預設值。指定預設引數值可以使函式的使用更為簡單,同時也增強了函式的可重用性。

相關推薦

CC++預設

C__帶預設值引數的函式說明 1.float area(float r=6.5); 指定r的預設值為6.5,如果在呼叫此函式時,確認r的值為6.5,則可以不必給出實參的值,如 area( );                              //相當於area

【ECMAScript 5_6_7】8、ES6——預設

一、形參預設值 * 形參的預設值----當不傳入引數的時候預設使用形參裡的預設值 function Point(x = 1,y = 2) { this.x = x; this.y = y; }   <!DOCTYPE html> <html l

C++mapvector作時如何給定預設引數?

      之前遇到過這種特殊場景, 我用static變數比較噁心地解決了問題, 其實, 有更優雅的方式:#include <iostream> #include <vector>

c語言的區別?

形式引數和實際引數 函式的引數分為形參和實參兩種。在本小節中,進一步介紹形參、實參的特點和兩者的關係。形參出現在函式定義中,在整個函式體內都可以使用,離開該函式則不能使用。實參出現在主調函式中,進入被調函式後,實參變數也不能使用。形參和實參的功能是作資料傳送。發生函式呼叫

C語言函式傳遞的變化不會改變實

如題,C語言在函式間傳遞引數時,形參的變化是不會改變實參的值的!!! 如: include<stdio.h> void main(){   void swap(int,int);   int a,b;   scanf("%d,%d",&a,&b)

C語言:將s所指字符串所有ASCII碼小於97的字符存入t所指字符數組

形參 一個 style bsp span ring \n ascii 不改變 //將形參s所指字符串中所有ASCII碼值小於97的字符存入形參t所指字符數組中,形成一個新串,並統計出符合條件的字符個數返回。 //關註點:使用*(t+n)的方式可以不改變指針的指向,像數組一

C函式為引用的情況;C++ *a *&a 的區別

開發十年,就只剩下這套架構體系了! >>>   

C++函式引用非引用

C++函式引用形參和非引用形參 C++中函式的形參主要有兩種型別: 非引用形參和引用形參, 對應兩種不同的引數傳遞方式。 void f(int t); void f(int &t); 非引用行參是實參的一個副本, 故對非引用形參的修改不會影響實參; 引用形參是實參的別名,

C/C++ 為什麼在函式內部修改並不能真正地改變傳入

一般有兩種傳遞方式: 1)值傳遞----包括(數值傳遞,指標傳遞)  2)引用傳遞 你問題中的指標傳遞,其實就是值傳遞:(下面這個你能看懂麼) void GetMemory( char p ) {  p = ‘a’; } void Test( void ) {  char str;  GetMemory(

C++ 基礎之 "引用" "利用const引用避免複製" &

之前兩篇文章裡的兩個函式如下所示: //過載操作符+ Vector3 operator+(const Vector3 &a){ return Vector3(x + a.x,y + a.y,z+a.z); } //比較兩

C語言:根據c指定的英文字母,按順序打印出若幹後繼相鄰字母,

*** def fopen pan fprintf rb+ += 鏈表結構 文件 //根據形參c中指定的英文字母,按順序打印出若幹後繼相鄰字母,輸出字母的大小與形參c一致,數量由形參d指定。例如:輸入c為Y,d為4,則輸出ZABC。 1 #include <

C#JAVA編寫事務代碼

com creat .class eas ++ acc data savepoint return C# DAL層代碼,運行多條增刪改,使用事務操作: /// <summary> /// 運行 多條增刪改 (非查詢語句)

CC++的計時器

ons 計數 函數返回 void 結構 命令 msdn ear trie   在我們調試代碼的時候,很多時候需要用代碼的運行時間來衡量代碼的效率,看了網上已經有了很多關於計時的文章,自己學習的時候再進行一些整理吧。 1. time()函數    在頭文件time.h中,

關於為函數搜索變量標識符的雲雲

info 吐槽 body 建議 blank 代碼檢查 聲明 ren 技術 為形參提供默認值是以前的一種流行方法: function foo(a){ a=a||1; console.log(a); } foo(); // 1 foo(12); /

c#Java的多態

rtu 重新 指定 demo har ati static lse 編譯器 多態:讓一個對象表現出多種類型,寫出通用的代碼,最大限度的屏蔽各個子類之間的差異性。 c#舉例: 1 將父類的方法標記為虛方法 ,使用關鍵字 virtual,這個函數可以被子類重新寫一個遍。

cC++main函式引數的意義用法

main函式是C++的主函式,除了程式本身外,任何函式都不可以呼叫main函式。main函式中可以新增引數,也可以不寫。main函式預設有兩個引數,main(int argc, char ** argv),其中,argc是用來表面main函式究竟呼叫了幾個引數,因為程式本身的檔名就是一個

JS的區別

JS中形參和實參的區別 from:https://blog.csdn.net/qq_33187168/article/details/50346465 形參出現在函式定義中,在整個函式體內都可以使用, 離開該函式則不能使用。 實參出現在主調函式中,進入被調函式後,實參變數也不能使用。

python3使用ctypes在windows訪問CC++動態連結庫函式示例

python3使用ctypes在windows中訪問C和C++動態連結庫函式示例 這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫 一 測試環境介紹和準備 測試環境: 作業系統:windows10 Python版本:3.7.0 VS版本:vs2015社群版(免費) 相關

python3使用ctypes在windows訪問CC++動態鏈接庫函數示例

mage linu href types windows 文件 function 動態鏈接 就是 python3使用ctypes在windows中訪問C和C++動態鏈接庫函數示例這是我們的第一個示例,我們盡量簡單,不傳參,不返回,不訪問其他的動態鏈接庫一 測試環境介紹和準備

cc++main函數的

div main span pan 數列 clas 函數的參數 == 列表 1、代碼 int main(int argc,char **argv[]) {return 0; } 2、分析 argc:代碼參數個數 argv:二級指針,很多個字符串,這裏代表