您好,登錄后才能下訂單哦!
在C++中,可以為參數指定默認值,C語言是不支持默認參數的,Java也不支持!!!
默認參數的語法與使用:
(1)在函數聲明或定義時,直接對參數賦值。這就是默認參數;
(2)在函數調用時,省略部分或全部參數。這時可以用默認參數來代替。
注意事項:
(1)函數默認值只能賦值一次,或者是在聲明中,或者是在定義中,如下所示
- /*正確*/
- #include <iostream>
- int f(int a=5);
- int f(int a)
- {
- std::cout <<a<<std::endl;
- return a;
- }
- int main()
- {
- f();
- return 0;
- }
- /*正確*/
- #include <iostream>
- int f(int a=5)
- {
- std::cout <<a<<std::endl;
- return a;
- }
- int main()
- {
- f();
- return 0;
- }
- /*正確*/
- #include <iostream>
- int f(int a);
- int f(int a=5)
- {
- std::cout <<a<<std::endl;
- return a;
- }
- int main()
- {
- f();
- return 0;
- }
- /*錯誤*/
- #include <iostream>
- int f(int a=5);
- int f(int a=5)
- {
- std::cout <<a<<std::endl;
- return a;
- }
- int main()
- {
- f();
- return 0;
- }
- [niuxinli@localhost ~]$ make test
- g++ test.cpp -o test
- test.cpp: In function ‘int f(int)’:
- test.cpp:3: error: default argument given for parameter 1 of ‘int f(int)’
- test.cpp:2: error: after previous specification in ‘int f(int)’
- make: *** [test] Error 1
(2) 默認參數定義的順序為自右到左。即如果一個參數設定了缺省值時,其右邊的參數都要有缺省值。比如int f(int a, int b=1,int c=2,int d=3)是對的,但是int f(int a,int b=1,int c=2,int d)就是錯的。這個的原因很顯然,你傳幾個參數,編譯器都認為是從左向右的,比如int f(int a,int b=1,int c),傳入了f(1,2),它會認為a=1,b=2,那c呢?所以必須做這個限定。
- #include <iostream>
- int f(int a,int b);
- int f(int a=5,int b)
- {
- std::cout <<a<<std::endl;
- return a;
- }
- int main()
- {
- f(6);
- return 0;
- }
- g++ test.cpp -o test
- test.cpp: In function ‘int f(int, int)’:
- test.cpp:3: error: default argument missing for parameter 2 of ‘int f(int, int)’
- make: *** [test] Error 1
(3)默認參數調用時,則遵循參數調用順序,自左到右逐個調用。這一點要與第(2)分清楚,不要混淆。
如:void mal(int a, int b=3, int c=5); //默認參數
mal(3, 8, 9 ); //調用時有指定參數,則不使用默認參數
mal(3, 5); //調用時只指定兩個參數,按從左到右順序調用,相當于mal(3,5,5);
mal(5); //調用時只指定1個參數,按從左到右順序調用v當于mal(5,3,5);
mal( ); //錯誤,因為a沒有默認值
mal(3, , 9) //錯誤,應按從左到右順序逐個調用
(4)默認參數可以是全局變量,全局常量,還可以是函數,但是不能是局部變量,因為局部變量在編譯時未定
如
- [niuxinli@localhost ~]$ cat test.cpp
- #include <iostream>
- int x = 5;
- int f(int a,int b,int c);
- int f(int a,int b=5,int c=x)
- {
- std::cout <<a+b+c<<std::endl;
- return a;
- }
- int f2(int (*func)(int,int,int)=f )
- {
- func(2,3,5);
- return 0;
- }
- int main()
- {
- f(1);
- f2();
- return 0;
- }
- [niuxinli@localhost ~]$ make test && ./test
- g++ test.cpp -o test
- 11
- 10
但是注意一點,func不能使用默認參數了,因為func是局部變量,它是后來被賦值成f的
- [niuxinli@localhost ~]$ cat test.cpp
- #include <iostream>
- int x = 5;
- int f(int a,int b,int c);
- int f(int a,int b=5,int c=x)
- {
- std::cout <<a+b+c<<std::endl;
- return a;
- }
- int f2(int (*func)(int,int,int)=f )
- {
- func(2);
- return 0;
- }
- int main()
- {
- f(1);
- f2();
- return 0;
- }
- [niuxinli@localhost ~]$ make test
- g++ test.cpp -o test
- test.cpp: In function ‘int f2(int (*)(int, int, int))’:
- test.cpp:11: error: too few arguments to function
- make: *** [test] Error 1
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。