c語言重載
Ⅰ c語言,c++,哪些運算符不能重載
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.
重載不能改變運算符操作數的個數。比如+需要兩個操作數,則重載的+也必須要有兩個操作數。
Ⅱ c語言 實現「+」的重載。(20分)
你需要 friend 和 operator
Ⅲ C語言可以重載嗎
不可以!!!重載是c++才有的
Ⅳ c語言怎麼寫重載函數
c語言寫重載函數:
首先明確重載函數的定義:在相同的聲明域中的函數名相同的,而參數表不同的,即通過函數的參數表而唯一標識並且來區分函數的一種特殊的函數。
當將要定義一組函數,使它們執行一系列的操作,但是它們是應用在不同的參數類型上的。此時可以選擇重載函數。
例如:
通過參數就可以一眼分辨不同的函數。
Ⅳ 什麼是C++重載
C++重載是C語言中的一種函數表現方式,即重載函數。
重載函數是函數的一種特殊情況,為方便使用,C++允許在同一范圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同。
也就是說用同一個運算符完成不同的運算功能。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題,不能只有函數返回值類型不同。
(5)c語言重載擴展閱讀:
C++運算符重載的相關規定如下:
1、不能改變運算符的優先順序。
2、不能改變運算符的結合型。
3、默認參數不能和重載的運算符一起使用。
4、不能改變運算符的操作數的個數。
5、不能創建新的運算符,只有已有運算符可以被重載。
6、運算符作用於C++內部提供的數據類型時,原來含義保持不變。
參考資料來源:網路:重載函數
Ⅵ C語言中的重載問題
sum(1,2)可以是調用sum(int,int)也可以是調用sum(float,float)
因為傳遞進去的1和2,可以被編譯器轉換成sum(1.0,2.0),編譯器不確定你要調用哪個
同理sum(1.2,2.4)也可能被編譯器轉換成sum(1,2),也不能確定你要調用哪個
sum(1.3,2.4)改成sum((float)1.3,(float)2.4)就可以了,如果寫成sum((float)1.3,2.4)或者sum(1.3,(float)2.4)也可以通過編譯,但是可能會有警告
用顯示的類型轉換來清楚地告訴編譯器要調用哪個
Ⅶ c語言符號重載
很簡單, 運算符 如+ - * / 等,兩邊的數據類型是可以變化的,
如1+1 對應的是 int型
1.0+1.0 對應的是float型
兩個式子調用的程序是不一樣的,但用的都是同一個運算符,這就是重載
你自己寫的類也可以用到這些運算符, 只要重載你用到的運算符自己寫演算法就可以了
Ⅷ C語言支持函數重載嗎
C語言是不支持函數重載的,但是C++是可以的,這是C++對C的一個重要擴展。
Ⅸ 在C語言中類成員,函數重載,繼承,派生類,類模板怎麼定義。
C語言中沒有類的概念,C++中才有類,有類成員變數,成員函數,對象,以及重載,繼承,派生的概念;
函數的重載是指在同一個類中具有相同的函數名,但是可能函數的返回值類型,或者形參個數,或者形參類型不同;
派生是指基類跟子類的關系:例如class
A:public
B;類A共有繼承B;
呵呵,這些東西需要你慢慢看,注意重載
跟覆蓋的區別以及與虛函數之間的關系,等等
至於類模板,就是你定義一個類,而不指定數據類型,關鍵字template,等到後面的開發中你可以實際根據需要實例化為你想要的
類型,例如int
,char,struct
等等
Ⅹ C語言函數重載問題
C語言沒有重載函數!printf是C語言的
函數
如果你是C++項目
那你直接寫函數就行了
如果你也是先變長
參數
函數的話
那就編譯出錯唄!