因為c++有名命修飾,他會把每一個參數的類型啥的用一個字符串來表示加到函數名上。所以重載的兩個同名函數編譯出來的函數名不同,所以不沖突

創新互聯服務項目包括中衛網站建設、中衛網站制作、中衛網頁制作以及中衛網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,中衛網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到中衛省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!
c沒有命名修飾,函數叫啥編譯出來就叫啥,同名函數當然會沖突的
從字面上的意思就是,可以重復進入。可重入是在多任務系統下的概念,意思是這個函數可以在運行到任意位置的時候被中斷去執行其他任務,并且返回的時候不會出現任何錯誤。為什么在多任務的時候才有這種概念。我舉個例子,我們定義了一個叫func的函數,同時定義了兩個線程,兩個線程都調用了func,那么就存在這種情況,線程1正在執行func的時候,線程2開始執行func了,導致兩個時刻兩個線程都在執行func,正常情況下兩個都能執行成功,并且沒有錯誤,我們就認為func是可重入的。但是如果func使用了公共資源,比如讀取同一個文件,或者訪問了同一個全局變量,這時候就會導致兩個線程訪問公共資源時發生沖突,這樣的函數就是不可重入的。
c語言沒有重載的概念,重載是C++的內容
c++運算符:
算術運算符:+,-,*,/,%,++,--;
位操作運算符:,|,~,^(位異或),<<(左移),>>(右移)
邏輯運算符:!,,||;
比較運算符:<,>,>=,<=,==,!=;
賦值運算符:=,+=,-=,*=,/=,%=,=,|=,^=,<<=,>>=;
其他運算符:[],(),->,,(逗號運算符),new,delete,new[],delete[],->*。
不能重載的總共五個:
(1)
"."(類成員訪問運算符)
(2)"
.*"(類成員指針訪問運算符)
(3)
"::"(域運算符)
(4)"siezof"(長度運算符)
(5)
"
?:"(條件運算符)
還有就是:typeid.
其中
.*是C++的類成員函數指針調用運算符,是用來調用一個類函數指針的。
舉例:
假設有一個ClassA類擁有一個成員函數void
ClassA::func(int
i),則可以這么用:
1
2
3
4
void
(ClassA::*fp)(int
i)
//
定義一個類函數指針。
ClassA
obj;
fp
=
ClassA::func;
//
給這個類函數指針賦值
(obj.*fp)(5);
//
這么用,相當于調用obj.func(5);
沒有什么非禁止operator?:重載的理由,只不過沒有必要而已。另外,expr1?expr2:expr3的重載函數無法保證expr2和expr3中只有一個被執行。
而“sizeof”無法被重載是因為不少內部操作,比如指針加法,都依賴于它,例如:
X
a[10];
X*
p
=
a[3];
X*
q
=
a[3];
p++;
//
p
points
to
a[4]
//
thus
the
integer
value
of
p
must
be
//
sizeof(X)
larger
than
the
integer
value
of
q
這樣,sizeof(X)無法在不違背基本語言規則的前提下表達什么新的語義。
在N::m中,N和m都不是表達式,它們只是編譯器“認識”的名字,“::”執行的實際操作是編譯時的名字域解析,并沒有表達式的運算牽涉在內。或許有人會覺得重載一個“x::y”(其中x是實際對象,而非名字域或類名)是一個好主意,但這樣做引入了新的語法[譯注:重載的本意是讓操作符可以有新的語義,而不是更改語法——否則會引起混亂],我可不認為新語法帶來的復雜性會給我們什么好處。
原則上來說,“.”運算符是可以被重載的,就像“-”一樣。不過,這會帶來語義的混淆——我們到底是想和“.”后面的對象打交道呢,還是“.”后面的東東所實際指向的實體打交道呢?看看這個例子(它假設“.”重載是可以的):
class
Y
{
public:
void
f();
//
...
};
class
X
{
//
assume
that
you
can
overload
.
public:
Y*
p;
Y
operator.()
{
return
*p;
}
void
f();
//
...
};
void
g(X
x)
{
x.f();
//
X::f
or
Y::f
or
error?
}
請注意:
1.
重載不能改變該運算符用于內置類型時的函義,程序員不能改變運算符+用于兩個int型時的含義。
2.
運算符函數的參數至少有一個必須是類的對象或者類的對象的引用。這種規定可以防止程序員運用運算符改變內置類型的函義。
3.
重載不能改變運算符的優先級。
4.
重載不能改變運算符的結合律。
5.
重載不能改變運算符操作數的個數。比如+需要兩個操作數,則重載的+也必須要有兩個操作數。
這個問題問的不錯。
其實printf不是重載,c語言不支持函數重載 這句話是對的。
printf函數是通過變長參數表實現的。你可以查看一下printf的函數原型聲明。
printf函數的實現在不同的機器上是不同的,但提供的接口是一致的。
printf函數的正確聲明形式如下:
int printf(const *fmt,...)
其中省略號表示參數表中參數的數量和類型是可變的。它是變長參數表的固定形式。
省略號只能出現在參數表的尾部。
具體的話你還是上網查查吧,我對這個原型也沒研究。
我想既然你能問這個問題,看點資料不難理解,很快能明白怎么回事。明白了以后,你就可以自己寫出這樣變長參數表的函數了。好好加油!
#include iostream
using namespace std;
class fun_overload{//定義一個重載函數類
public:
void display(int int_num ){//輸出整型方法
cout"int: "int_numendl;
}
void display(char cha_num ){//輸出字符方法
cout"char: "cha_numendl;
}
void display( double dou_num ){//輸出雙精度型方法
cout"double: "dou_numendl;
}
void display( float flo_num){//輸出浮點型方法
cout"float: "flo_numendl;
}
void display(short sho_num ){//輸出短整型方法
cout"short: "sho_numendl;
}
fun_overload(){};//構造
~fun_overload(){};//析構
};
int main()
{
fun_overload *f=0;
int a=1;
char b='a';
double c=1.1;
float d=1.110f;
short e=1;
//指針調用fun_overlaod類里的不同類型的函數
f-display(a );
f-display(b );
f-display(c );
f-display(d );
f-display(e );
getchar();
system("cls");
return 0;
}
int x,y,n=0; // 這個語句只會初始化n為0,不會初始化x,y為0。
沒被初始化的變量x、y,其值隨機。所以程序執行會有問題。
---
至于函數重載,C語言不支持,C++才支持。
查看codeblocks所用math.h,只有一個名為fabs的函數,即
_CRTIMP double __cdecl fabs (double);
還有一個名為fabsf的函數:
extern float __cdecl fabsf (float x);
因為#include cmath指令包含的是文件math.h,而math.h繼承至C語言,C語言不支持函數重載,所以fabs不會是重載函數。
當前名稱:重載函數可以用在c語言嗎 C語言允許函數重載嗎
網站路徑:http://www.yijiale78.com/article16/doddpdg.html
成都網站建設公司_創新互聯,為您提供網頁設計公司、網站收錄、網站改版、手機網站建設、服務器托管、網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯