編譯器是通過什麼來區分重載
1. 重寫和重載的三點區別
重載(Overloading)和重寫(Overriding)是java中兩個比較重要的概念。但是對於新手來說也比較容易混淆。下面是我為大家准備的重寫和重載的區別,希望大家喜歡!
重寫和重載的區別一:定義
重載
簡單說,就是函數或者 方法 有同樣的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。
重寫
重寫指的是在Java的子類與父類中有兩個名稱、參數列表都相同的方法的情況。由於他們具有相同的方法簽名,所以子類中的新方法將覆蓋父類中原有的方法。
重寫和重載的區別二:相關知識
關於重載和重寫,你應該知道以下幾點:
1、重載是一個編譯期概念、重寫是一個運行期間概念。
2、重載遵循所謂“編譯期綁定”,即在編譯時根據參數變數的類型判斷應該調用哪個方法。
3、重寫遵循所謂“運行期綁定”,即在運行的時候,根據引用變數所指向的實際對象的類型來調用方法
4、因為在編譯期已經確定調用哪個方法,所以重載並不是多態。而重寫是多態。重載只是一種語言特性,是一種語法規則,與多態無關,與面向對象也無關。(註:嚴格來說,重載是編譯時多態,即靜態多態。但是,Java中提到的多態,在不特別說明的情況下都指動態多態)
重寫和重載的區別三:對比
重寫的例子
下面是一個重寫的例子,看完代碼之後不妨猜測一下輸出結果:
class Dog{
public void bark(){
System.out.println("woof ");
}
}
class Hound extends Dog{
public void sniff(){
System.out.println("sniff ");
}
public void bark(){
System.out.println("bowl");
}
}
public class OverridingTest{
public static void main(String [] args){
Dog dog = new Hound();
dog.bark();
}
}
輸出結果:
bowl
上面的例子中,dog對象被定義為Dog類型。在編譯期,編譯器會檢查Dog類中是否有可訪問的bark()方法,只要其中包含bark()方法,那麼就可以編譯通過。在運行期,Hound對象被new出來,並賦值給dog變數,這時,JVM是明確的知道dog變數指向的其實是Hound對象的引用。所以,當dog調用bark()方法的時候,就會調用Hound類中定義的bark()方法。這就是所謂的動態多態性。
重寫的條件
參數列表必須完全與被重寫方法的相同;
返回類型必須完全與被重寫方法的返回類型相同;
訪問級別的限制性一定不能比被重寫方法的強;
訪問級別的限制性可以比被重寫方法的弱;
重寫方法一定不能拋出新的檢查異常或比被重寫的方法聲明的檢查異常更廣泛的檢查異常
重寫的方法能夠拋出更少或更有限的異常(也就是說,被重寫的方法聲明了異常,但重寫的方法可以什麼也不聲明)
不能重寫被標示為final的方法;
如果不能繼承一個方法,則不能重寫這個方法。
重載的例子
class Dog{
public void bark(){
System.out.println("woof ");
}
//overloading method
public void bark(int num){
for(int i=0; i
System.out.println("woof ");
}
}
上面的代碼中,定義了兩個bark方法,一個是沒有參數的bark方法,另外一個是包含一個int類型參數的bark方法。在編譯期,編譯期可以根據方法簽名(方法名和參數情況)情況確定哪個方法被調用。
重載的條件
被重載的方法必須改變參數列表;
被重載的方法可以改變返回類型;
被重載的方法可以改變訪問修飾符;
被重載的方法可以聲明新的或更廣的檢查異常;
方法能夠在同一個類中或者在一個子類中被重載。
2. C++如何實現函數重載的,即C++編譯系統如何區分不同的重載函數
編譯之後,同名的函數會根據其參數的不同等對名字做處理
比如說
int num() - > num@xxyy
int num(int n) - > num@aabbcc
我只是舉例子,實際上生成的符號可能有所區別,但是c++的編譯器就是這么處理重載的,你使用vc自帶的mpbin可以查看dll的導出符號,或者自己編寫一個dll導出重載的函數,然後命令行
mpbin -exports XX.dll > a.txt
可以查看你的同名的函數被編譯器分配了一個什麼樣的名稱~~@符號之後的字元串肯定不同的,@前面的函數名是一樣的~
不知道你清楚了沒,不然我明天給你發一下我的截圖,之前我做COM互操作研究了一下~~可以切磋下~~
3. java 重載和重寫的區別
1.定義區別:
①重載是指不同的函數使用相同的函數名,但是函數的參數個數或類型不同。調用的時候根據函數的參數來區別不同的函數。
②覆蓋(也叫重寫)是指在派生類中重新對基類中的虛函數(注意是虛函數)重新實現。即函數名和參數都一樣,只是函數的實現體不一樣。
2.類的關系區別
覆蓋是子類和父類之間的關系,是垂直關系;重載是同一個類中方法之間的關系,是水平關系。
3.產生方法區別
覆蓋只能由一個方法或只能由一對方法產生關系;重載是多個方法之間的關系。
4.參數列表要求區別
覆蓋要求參數列表相同;重載要求參數列表不同。
5.調用方法區別
覆蓋關系中,調用方法體是根據對象的類型來決定;而重載關系是根據調用時的實參表與形參表來選擇方法體的。
(3)編譯器是通過什麼來區分重載擴展閱讀
方法的重寫:
1、在子類中可以根據需要對從基類中繼承來的方法進行重寫。
2、重寫的方法和被重寫的方法必須具有相同方法名稱、參數列表和返回類型。(註:返回值可以為父類中返回值的子類型.參數若為子類,則不是重寫是重載)
3、重寫方法不能使用比被重寫的方法更嚴格的訪問許可權。
4. 重寫方法不能聲明拋出比被重寫方法范圍更大的異常類型。
總結:重寫是子類對所繼承父類相同方法的一種更改,這個更改需要遵循格式按照父類的格式,訪問許可權,拋出異常等等,都在父類方法控制范圍內,內部具體實現可以實現不同的效果。
4. C++語言的基本語法規則
C++語言的基本語法規則
C++是由AT&T Bell(貝爾)實驗室的Bjarne Stroustrup博士及其同事於20世紀80年代初在C語言的基礎上開發成功的。下面是我收集的C++語言的基本語法規則,希望大家認真閱讀!
C++語法表達式規則的建立基礎
C++ 中的布爾類型:布爾類型只佔用一個bit ,但是如果連續定義多個布爾類型時,編譯器可能會多個布爾類型定義在一起。true 編譯器用1來表示。false 編譯器用0來表示。
將一個其他類型的數據賦給布爾類型變數:C++編譯器會將所有的非0的值轉換為true(1),將0 轉化為false(0)。
三木運算符 ? : :將一個三目運算符作為左值: (a>b?a:b) = 3 C語言不支持(三目運算符返回一個值),但在C++中支持(三目元算符返回變數)。 但是如果可能的返回值有一個是常量值,那麼它就不能作為左值使用,如(a>b?1:b) = 3 非法。
引用:
C++中的引用:一個已經定義的變數的別名。 Type var , Type & name = var; 普通引用在聲明時必須用其他的變數進行初始化。引用作為函數參數聲明時不進行初始化。
const 修飾引用:const 使引用擁有隻讀屬性,但是變數本身還是原來的屬性。
當使用常量對const 引用進行初始化時,編譯器會給常量分配空間,並將引用名命名為這段空間的別名。不能給普通引用賦值為常量,但是可以給常引用賦值為常量。此時常引用是只讀的,除了在定義時,不能給它賦值。因此用一個常引用可以構成一個只讀的變數,如 const int & a = 10 a是一個只讀變數。
引用在C++ 的內部實現是一個常指針:type & name ßàtype* const name。因此引用擁有一個4位元組的空間。
引用作為函數返回值:返回局部變數的引用時,引用不能作為左值,也不能用它初始化其他引用,但是如果引用時靜態的或者全局變數的引用時就可以。
C++ 函數探幽:
內聯函數:inline int function(…), 內聯函數可以替代宏代碼片段,在編譯時將函數體直接替代函數被調用的'地方,這樣就減少了普通函數被調用時 的開銷(壓棧,跳轉等),但是內聯函數本質上還是一個函數,不同於宏代碼片段。內聯函數聲明符inline 必須要和函數定義結合在一起,不能放在聲明處,否則編譯器忽略內聯請求。 雖然內聯函數省時省空間,但是編譯器不一定準許函數的內聯請求,當C++編譯器不允許內聯請求時會將內聯函數當做普通函數處理。
默認參數: C++中可以在函數聲明時為參數提供一個默認值,當函數調用時沒有提供這個參數的值,編譯器會自動用默認值代替。但是在函數定義時就不在指定默認參數值。默認參數有如下規則:
只有參數列表後面的部分參數才可以提供默認參數值,一但在一個函數調用中開始使用默認參數,那麼這個參數後的所有參數都必須使用默認參數,因此從開始使用默認參數的使用開始都後面的參數都要提供默認參數,否則編譯器將報錯。總之,在函數聲明時,如果一個參數開始提供默認參數,那麼後面的所有參數都要提供默認參數;在調用函數時,如果開始省略參數,那麼後面所有參數都使用默認參數。
函數佔位參數:佔位參數是在函數定義時只有類型聲明,沒有參數名聲明的參數。一般情況下函數體內部無法使用佔位參數。但是在調用時必須提供完整的參數個數。可以給佔位參數提供默認參數。意義:為函數的後續版本的擴展埋下伏筆;兼容C語言中的不規范寫法。
函數重載:簡單來說函數重載就是用同一個函數名來定義不同的函數。那編譯器是如何區分這些函數的呢?事實上,編譯器是通過參數列表來區分重載了的函數。即重載函數擁有不同的參數列表。不同的參數列表包括參數個數不同、參數類型不同、參數順序不同,即滿足上述三個條件之一就能構成重載函數。函數重載在構造函數中是非常有用的。
;