自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對(duì)C++編程錯(cuò)誤進(jìn)行說(shuō)明講解

開(kāi)發(fā) 后端
C++中的結(jié)構(gòu)與類(lèi)差不多,唯一的區(qū)別是,在缺省狀態(tài)下,結(jié)構(gòu)的訪問(wèn)權(quán)限是public,其繼續(xù)權(quán)限也是public.一些C++編程人員將結(jié)構(gòu)作為數(shù)據(jù)對(duì)象,但這只是一個(gè)約定而非是必須這樣的

C++編程錯(cuò)誤分為:注重隱性的數(shù)據(jù)類(lèi)型轉(zhuǎn)換、結(jié)構(gòu)與對(duì)象是有區(qū)別的、虛方法必須被明確地覆蓋,下面就C++編程時(shí)遇到的錯(cuò)誤進(jìn)行學(xué)習(xí)探討,希望大家能夠在此得到自己想要的東西。

錯(cuò)誤1:注重隱性的數(shù)據(jù)類(lèi)型轉(zhuǎn)換

Boxing和unboxing是使值型數(shù)據(jù)類(lèi)型被當(dāng)作索引型數(shù)據(jù)類(lèi)型使用的二個(gè)過(guò)程。值型變量可以被包裝進(jìn)一個(gè)對(duì)象中,然后再被解包回值型變量。包括內(nèi)置數(shù)據(jù)類(lèi)型在內(nèi)的所有C#中的數(shù)據(jù)類(lèi)型都可以被隱性地轉(zhuǎn)化為一個(gè)對(duì)象。包裝一個(gè)值型變量就會(huì)生成一個(gè)對(duì)象的實(shí)例,然后將變量拷貝到實(shí)例中。#t#

Boxing是隱性的,假如在需要索引型數(shù)據(jù)類(lèi)型的地方使用了值型數(shù)據(jù)類(lèi)型的變量,值型變量就會(huì)隱性地轉(zhuǎn)化為索引型數(shù)據(jù)類(lèi)型的變量。Boxing會(huì)影響代碼執(zhí)行的性能,因此應(yīng)當(dāng)盡量避免,尤其是在數(shù)據(jù)量較大的時(shí)候。

假如要將一個(gè)打包的對(duì)象轉(zhuǎn)換回原來(lái)的值型變量,必須顯性地對(duì)它進(jìn)行解包。解包需要二個(gè)步驟:首先對(duì)對(duì)象實(shí)例進(jìn)行反省,確保它們是由值型的變量被包裝成的;第二步將實(shí)例中的值拷貝到值型變量中。為了確保解包成功,被解包的對(duì)象必須是通過(guò)打包一個(gè)值型變量的值生成的對(duì)象的索引。

  1. using System;  
  2. public class UnboxingTest  
  3. {  
  4. public static void Main()  
  5. {  
  6. int i = 123; //打包  
  7. object o = i; // 解包(必須是顯性的)  
  8. int j = (int) o;  
  9. Console.WriteLine("j: {0}", j); }  
  10. }  

錯(cuò)誤2:結(jié)構(gòu)與對(duì)象是有區(qū)別的

C++中的結(jié)構(gòu)與類(lèi)差不多,***的區(qū)別是,在缺省狀態(tài)下,結(jié)構(gòu)的訪問(wèn)權(quán)限是public,其繼續(xù)權(quán)限也是public.一些C++編程人員將結(jié)構(gòu)作為數(shù)據(jù)對(duì)象,但這只是一個(gè)約定而非是必須這樣的。在C#中,結(jié)構(gòu)只是一個(gè)用戶(hù)自定義的數(shù)據(jù)類(lèi)型,并不能取代類(lèi)。盡管結(jié)構(gòu)也支持屬性、方法、域和操作符,但不支持繼續(xù)和destructor.

更重要的是,類(lèi)是一種索引型數(shù)據(jù)類(lèi)型,結(jié)構(gòu)是值型數(shù)據(jù)類(lèi)型。因此,結(jié)構(gòu)在表達(dá)無(wú)需索引操作的對(duì)象方面更有用。結(jié)構(gòu)在數(shù)組操作方面的效率更高,而在集合的操作方面則效率較低。集合需要索引,結(jié)構(gòu)必須打包才適合在集合的操作中使用,類(lèi)在較大規(guī)模的集合操作中的效率更高。

錯(cuò)誤3:虛方法必須被明確地覆蓋

在C#語(yǔ)言中,編程人員在覆蓋一個(gè)虛方法時(shí)必須顯性地使用override關(guān)健字。假設(shè)一個(gè)Window類(lèi)是由A公司編寫(xiě)的,ListBox和RadioButton類(lèi)是由B公司的和編程人員在購(gòu)買(mǎi)的A公司編寫(xiě)的Window類(lèi)的基礎(chǔ)上編寫(xiě)的,B公司的編程人員對(duì)包括Window類(lèi)未來(lái)的變化情況在內(nèi)的設(shè)想知之甚少。假如B公司的一位編程人員要在ListBox上添加一個(gè)Sort方法:

  1.   public class ListBox : Window  
  2.   { public virtual void Sort() {"}  
  3. }   

在A公司發(fā)布新版的Window類(lèi)之前,這不會(huì)有任何問(wèn)題。假如A公司的編程人員也在Window類(lèi)中添加了一個(gè)Sort方法。

  1. public class Window  
  2. { // " public virtual void Sort() {"}  

在C++中,Windows類(lèi)中的Sort方法將成為L(zhǎng)istBox類(lèi)中Sort方法的基礎(chǔ)方法,在期望調(diào)用Windows類(lèi)中的Sort方法時(shí),ListBox類(lèi)中的Sort方法就會(huì)被調(diào)用。在C#中,虛擬函數(shù)總是被認(rèn)為是虛擬調(diào)度的根。也就是說(shuō),一旦C#發(fā)現(xiàn)一個(gè)虛擬的方法,就不會(huì)再在虛擬鏈中查找其他虛擬方法。假如ListBox再次被編譯,編譯器就會(huì)生成一個(gè)警告信息:

  1. "class1.cs(54,24): warning CS0114: 'ListBox.Sort()' hides  
  2. inherited member 'Window.Sort()'. 

要使當(dāng)前的成員覆蓋原來(lái)的方法,就需要添加override關(guān)健字,或者添加new關(guān)健字。要消除警告信息,編程人員必須搞清楚他想干什么??梢栽贚istBox類(lèi)中的Sort方法前添加new,表明它不該當(dāng)覆蓋Window中的虛方法:

  1. public class ListBox : Window {  
  2. public new virtual void Sort() {"}   

這樣就可以清除警告信息。假如C++編程人員確實(shí)期望覆蓋掉Window中的方法,就必須使用override關(guān)健字來(lái)顯性地表明其意圖。

責(zé)任編輯:chenqingxiang 來(lái)源: 人民郵電出版社
相關(guān)推薦

2010-01-25 18:26:44

CC++頭文件

2010-03-03 16:20:40

Android項(xiàng)目

2010-03-15 10:39:57

2010-01-08 10:41:56

JSON 數(shù)據(jù)

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2010-01-11 14:13:03

C++學(xué)習(xí)方法

2010-01-14 13:39:45

Visual C++優(yōu)

2010-01-15 19:34:25

C++設(shè)計(jì)

2010-01-11 09:56:07

C++編程實(shí)例

2010-01-12 10:40:22

C++程序員

2010-01-20 17:48:07

C++ 函數(shù)重載

2010-01-28 14:04:35

C++鏈表

2010-01-13 18:47:53

C++教程

2010-01-13 16:44:03

C++

2010-01-27 14:24:15

C++程序設(shè)計(jì)

2010-01-12 17:55:03

C++程序

2010-01-13 10:16:42

C++軟件

2010-01-15 17:18:57

C++源程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)