對C++編程錯誤進行說明講解
C++編程錯誤分為:注重隱性的數(shù)據(jù)類型轉(zhuǎn)換、結(jié)構(gòu)與對象是有區(qū)別的、虛方法必須被明確地覆蓋,下面就C++編程時遇到的錯誤進行學習探討,希望大家能夠在此得到自己想要的東西。
錯誤1:注重隱性的數(shù)據(jù)類型轉(zhuǎn)換
Boxing和unboxing是使值型數(shù)據(jù)類型被當作索引型數(shù)據(jù)類型使用的二個過程。值型變量可以被包裝進一個對象中,然后再被解包回值型變量。包括內(nèi)置數(shù)據(jù)類型在內(nèi)的所有C#中的數(shù)據(jù)類型都可以被隱性地轉(zhuǎn)化為一個對象。包裝一個值型變量就會生成一個對象的實例,然后將變量拷貝到實例中。#t#
Boxing是隱性的,假如在需要索引型數(shù)據(jù)類型的地方使用了值型數(shù)據(jù)類型的變量,值型變量就會隱性地轉(zhuǎn)化為索引型數(shù)據(jù)類型的變量。Boxing會影響代碼執(zhí)行的性能,因此應當盡量避免,尤其是在數(shù)據(jù)量較大的時候。
假如要將一個打包的對象轉(zhuǎn)換回原來的值型變量,必須顯性地對它進行解包。解包需要二個步驟:首先對對象實例進行反省,確保它們是由值型的變量被包裝成的;第二步將實例中的值拷貝到值型變量中。為了確保解包成功,被解包的對象必須是通過打包一個值型變量的值生成的對象的索引。
- using System;
- public class UnboxingTest
- {
- public static void Main()
- {
- int i = 123; //打包
- object o = i; // 解包(必須是顯性的)
- int j = (int) o;
- Console.WriteLine("j: {0}", j); }
- }
錯誤2:結(jié)構(gòu)與對象是有區(qū)別的
C++中的結(jié)構(gòu)與類差不多,***的區(qū)別是,在缺省狀態(tài)下,結(jié)構(gòu)的訪問權(quán)限是public,其繼續(xù)權(quán)限也是public.一些C++編程人員將結(jié)構(gòu)作為數(shù)據(jù)對象,但這只是一個約定而非是必須這樣的。在C#中,結(jié)構(gòu)只是一個用戶自定義的數(shù)據(jù)類型,并不能取代類。盡管結(jié)構(gòu)也支持屬性、方法、域和操作符,但不支持繼續(xù)和destructor.
更重要的是,類是一種索引型數(shù)據(jù)類型,結(jié)構(gòu)是值型數(shù)據(jù)類型。因此,結(jié)構(gòu)在表達無需索引操作的對象方面更有用。結(jié)構(gòu)在數(shù)組操作方面的效率更高,而在集合的操作方面則效率較低。集合需要索引,結(jié)構(gòu)必須打包才適合在集合的操作中使用,類在較大規(guī)模的集合操作中的效率更高。
錯誤3:虛方法必須被明確地覆蓋
在C#語言中,編程人員在覆蓋一個虛方法時必須顯性地使用override關(guān)健字。假設(shè)一個Window類是由A公司編寫的,ListBox和RadioButton類是由B公司的和編程人員在購買的A公司編寫的Window類的基礎(chǔ)上編寫的,B公司的編程人員對包括Window類未來的變化情況在內(nèi)的設(shè)想知之甚少。假如B公司的一位編程人員要在ListBox上添加一個Sort方法:
- public class ListBox : Window
- { public virtual void Sort() {"}
- }
在A公司發(fā)布新版的Window類之前,這不會有任何問題。假如A公司的編程人員也在Window類中添加了一個Sort方法。
- public class Window
- { // " public virtual void Sort() {"}
- }
在C++中,Windows類中的Sort方法將成為ListBox類中Sort方法的基礎(chǔ)方法,在期望調(diào)用Windows類中的Sort方法時,ListBox類中的Sort方法就會被調(diào)用。在C#中,虛擬函數(shù)總是被認為是虛擬調(diào)度的根。也就是說,一旦C#發(fā)現(xiàn)一個虛擬的方法,就不會再在虛擬鏈中查找其他虛擬方法。假如ListBox再次被編譯,編譯器就會生成一個警告信息:
- "class1.cs(54,24): warning CS0114: 'ListBox.Sort()' hides
- inherited member 'Window.Sort()'.
要使當前的成員覆蓋原來的方法,就需要添加override關(guān)健字,或者添加new關(guān)健字。要消除警告信息,編程人員必須搞清楚他想干什么。可以在ListBox類中的Sort方法前添加new,表明它不該當覆蓋Window中的虛方法:
- public class ListBox : Window {
- public new virtual void Sort() {"}
這樣就可以清除警告信息。假如C++編程人員確實期望覆蓋掉Window中的方法,就必須使用override關(guān)健字來顯性地表明其意圖。