㈠ 為什麼c++支持重載而c語言不支持重載
因為c++有名命修飾,他會把每一個參數的類型啥的用一個字元串來表示加到函數名上。所以重載的兩個同名函數編譯出來的函數名不同,所以不沖突
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語言,c++,哪些運算符不能重載
不能重載的運算符只有5個:
1、. (成員訪問運算符)
2、.* (成員指針訪問運算符)
3、:: (域運算符)
4、sizeof
(長度運算符)
5、?: (條件運算符)
前兩個運算符不能重載是為了保證訪問成員的功能不能被改變,域運算符和sizeof
運算符的運算對象是類型而不是變數或一般表達式,不具備重載的特徵。
㈣ C語言可以重載嗎
不可以!!!重載是c++才有的
㈤ c語言中,既然不支持函數重載,那麼printf算怎麼回事在c語言中,它不就是被重載了嗎
這個問題問的不錯。
其實printf不是重載,c語言不支持函數重載 這句話是對的。
printf函數是通過變長參數表實現的。你可以查看一下printf的函數原型聲明。
printf函數的實現在不同的機器上是不同的,但提供的介面是一致的。
printf函數的正確聲明形式如下:
int printf(const *fmt,...)
其中省略號表示參數表中參數的數量和類型是可變的。它是變長參數表的固定形式。
省略號只能出現在參數表的尾部。
具體的話你還是上網查查吧,我對這個原型也沒研究。
我想既然你能問這個問題,看點資料不難理解,很快能明白怎麼回事。明白了以後,你就可以自己寫出這樣變長參數表的函數了。好好加油!
㈥ C語言函數重載問題
C語言沒有重載函數!printf是C語言的
函數
如果你是C++項目
那你直接寫函數就行了
如果你也是先變長
參數
函數的話
那就編譯出錯唄!
㈦ C語言里的函數是否可以進行重載嗎
標准C, 不支持函數重載。
函數重載是C++的概念。 不光是類的成員函數, 一般函數以及模板函數都是可以重載的。
㈧ C語言支持函數重載嗎
C語言是不支持函數重載的,但是C++是可以的,這是C++對C的一個重要擴展。
㈨ C語言中沒有參數的兩個函數可以重載嗎
C語言中,有沒有參數的函數都不能重載,只有C++才有函數重載功能。