先來了解預設引數是什麼吧!
預設引數是指在定義或宣告函式時,為引數指定預設值,在呼叫函式時,可以傳遞引數,也可以不傳遞引數;如果沒有
傳遞引數,則在函式中使用預設引數的預設值!
對於預設引數不要單純的錯誤的理解為就是函式的引數帶有乙個預設值,其實他強調的不僅是引數的預設的值還有如果
沒有傳遞引數可以使用預設的引數;也就是說你呼叫函式時可以不帶引數,卻仍然能正常執行(這是用的就是預設引數的默
認值);因為編譯器會自動呼叫預設引數
最典型的就是在帶預設引數的建構函式:
比如說你定義了乙個class a; a有兩個private資料成員int a;和int b;如果不是用預設的建構函式的話**如下:
a(); //
不帶引數的建構函式
a(inta,int b);//
帶引數的建構函式
如果你在新建物件時,如初始化
a a1; //初始化呼叫a();
a a2(3,4); //賦值呼叫a(int a,int b);
而如果使用帶預設引數的建構函式時就不需要不帶引數的建構函式了;如下:
a(int a=0,int b=0);
則不需要在寫出不帶引數的建構函式了;因為你如果這樣定義物件:
a a1; //
呼叫的還是a(inta=0,int b=0)因為編譯器就不再產生預設的建構函式a();而是直接呼叫a(int a=0,int b=0)
//因為沒有實參的建構函式,是預設建構函式,引數指定了預設值的建構函式也是預設建構函式,乙個類只能有乙個預設建構函式
這裡要說明的是乙個類在寫了預設建構函式之後就不會自動生成預設的建構函式,如果你寫的是帶預設引數的建構函式,則其實已經有了預設建構函式,如果在定義乙個就會出現在a()就會出錯了!看看下面的**吧!
例如:
[cpp]view plain
copy
#include
#include
using
namespace
std;
class
a
a(int
a=0,
intb=0)
void
display();
private
: int
data1;
intdata2;
};
void
a::display()
void
main()
編譯後會出現錯誤是(用的vs2010)
c++1>f:\物件導向\miao_9\miao_9\12.cpp(8): error c2535: 「a::a(void)」: 已經定義或宣告成員函式
1> f:\物件導向\miao_9\miao_9\12.cpp(7) : 參見「a::a」的宣告
1>f:\物件導向\miao_9\miao_9\12.cpp(14): warning c4520: 「a」: 指定了多個預設建構函式
1>f:\物件導向\miao_9\miao_9\12.cpp(22): error c2668: 「a::a」: 對過載函式的呼叫不明確
1> f:\物件導向\miao_9\miao_9\12.cpp(9): 可能是「a::a(int,int)」
1> f:\物件導向\miao_9\miao_9\12.cpp(7): 或 「a::a(void)」
現在解釋下上面的錯誤出現的原因吧:首先要說的就是「指定了多個預設建構函式」
a()
a()
如上所說的這兩個都是預設建構函式,而乙個類只能呼叫乙個預設建構函式(一定要注意帶預設引數的建構函式也是預設建構函式!)
在就是
對過載函式的呼叫不明確
也就是所說的二義性啊,因為編譯器不知道呼叫哪個預設的建構函式啊!
a a1;
建立這個物件時呼叫預設建構函式時,兩個預設建構函式都符合,所以編譯器不知道呼叫哪個!只需要把a()刪掉那麼兩個問題就都解決了。
現在在舉個函式過載時二義性例子:
[cpp]view plain
copy
#include
using
namespace
std;
intmax(
inta,
intb);
intmax(
inta=0,
intb=0,
intc=0);
//函式過載
void
main()
intmax(
inta,
intb)
編譯後報錯如下(vs2010):
c++1> 正在建立「debug\miao_12.unsuccessfulbuild」,因為已指定「alwayscreate」。
1>clcompile:
1> 2.cpp
1>f:\物件導向\miao_12\miao_12\2.cpp(9): error c2668: 「max」: 對過載函式的呼叫不明確
1> f:\物件導向\miao_12\miao_12\2.cpp(4): 可能是「int max(int,int,int)」
1> f:\物件導向\miao_12\miao_12\2.cpp(3): 或 「int max(int,int)」
1> f:\visualstudio\vc\include\xutility(2078): 或 「const _ty &std::max(const _ty&,const _ty &)」
1> with
「函式過載呼叫不明確」也就是在呼叫max(a,b)時兩個
[cpp]view plain
copy
intmax(
inta,
intb);
intmax(
inta=0,
intb=0,
intc=0);
//函式過載
在語法上呼叫都是合法的,所以才會出現呼叫不明確啊,對於int max(int a,int b)無可非議,呼叫他是合法的。而對於int max(int a=0,int b=0,int c=0)也是符合語法的,這就是c++的預設引數效果,因為c++對於使用預設引數的函式是不一定傳遞函式的引數,也就是說引數是可以省略的!至於怎麼改就不在贅述了,,,,
說道這裡,應該差不多了吧!呵呵,,還是那句老話,對於有不對之處,還望指出!
大話C 預設引數及其所引起的二義性
先來了解預設引數是什麼吧!預設引數是指在定義或宣告函式時,為引數指定預設值,在呼叫函式時,可以傳遞引數,也可以不傳遞引數 如果沒有 傳遞引數,則在函式中使用預設引數的預設值!對於預設引數不要單純的錯誤的理解為就是函式的引數帶有乙個預設值,其實他強調的不僅是引數的預設的值還有如果 沒有傳遞引數可以使用...
C (帶有預設引數的函式引數)預設函式引數
預設引數?在c 中,允許實參的個數與形參的個數不同。在宣告函式原型時,為乙個或者多個形參指定預設值,以後呼叫這個函式時,若省略某乙個實參,c 則自動的以預設值作為相應引數的值。實列說明 includeusing namespace std int add int x 4,int y 7 int ma...
C 建構函式過載以及預設引數引起的二義性
大家都知道當我們宣告乙個類時,系統會提供乙個預設建構函式。當我們需要提供引數進行對類資料成員進行初始化時 就需要對類的帶參建構函式進行過載。同時,如果我們需要呼叫預設建構函式進行類資料成員的初始化時,還需要對類的 預設建構函式進行過載。也許就在這一塊,我們很多人都遇到過同樣的錯誤 當我們給出乙個帶預...