首頁(yè) - 網(wǎng)校 - 萬(wàn)題庫(kù) - 美好明天 - 直播 - 導(dǎo)航

2017年全國(guó)計(jì)算機(jī)二級(jí)C++考試復(fù)習(xí)知識(shí)點(diǎn)(3)

來(lái)源:考試吧 2017-09-29 9:35:31 要考試,上考試吧! 萬(wàn)題庫(kù)
“2017年全國(guó)計(jì)算機(jī)二級(jí)C++考試復(fù)習(xí)知識(shí)點(diǎn)(3)”供考生參考。更多計(jì)算機(jī)等級(jí)考試復(fù)習(xí)資料等信息請(qǐng)?jiān)L問(wèn)考試吧計(jì)算機(jī)等級(jí)考試網(wǎng)。

  點(diǎn)擊查看:2017年全國(guó)計(jì)算機(jī)二級(jí)C++考試復(fù)習(xí)知識(shí)點(diǎn)匯總

  C++的內(nèi)部數(shù)據(jù)類(lèi)型遵循隱式類(lèi)型轉(zhuǎn)換規(guī)則。假設(shè)某個(gè)表達(dá)市中使用了一個(gè)短整型變量,而編譯器根據(jù)上下文認(rèn)為這兒需要是的長(zhǎng)整型,則編譯器就會(huì)根據(jù)類(lèi)型轉(zhuǎn)換規(guī)則自動(dòng)把它轉(zhuǎn)換成長(zhǎng)整型,這種隱式轉(zhuǎn)換出現(xiàn)在賦值、參數(shù)傳遞、返回值、初始化和表達(dá)式中。我們也可以為類(lèi)提供相應(yīng)的轉(zhuǎn)換規(guī)則。

  對(duì)一個(gè)類(lèi)建立隱式轉(zhuǎn)換規(guī)則需要構(gòu)造一個(gè)轉(zhuǎn)換函數(shù),該函數(shù)作為類(lèi)的成員,可以把該類(lèi)的對(duì)象和其他數(shù)據(jù)類(lèi)型的對(duì)象進(jìn)行相互轉(zhuǎn)換。聲明了轉(zhuǎn)換函數(shù),就告訴了編譯器,當(dāng)根據(jù)句法判定需要類(lèi)型轉(zhuǎn)換時(shí),就調(diào)用函數(shù)。

  有兩種轉(zhuǎn)換函數(shù)。一種是轉(zhuǎn)換構(gòu)造函數(shù);另一種是成員轉(zhuǎn)換函數(shù)。需要采用哪種轉(zhuǎn)換函數(shù)取決于轉(zhuǎn)換的方向。

  一、轉(zhuǎn)換構(gòu)造函數(shù)

  當(dāng)一個(gè)構(gòu)造函數(shù)僅有一個(gè)參數(shù),且該參數(shù)是不同于該類(lèi)的一個(gè)數(shù)據(jù)類(lèi)型,這樣的構(gòu)造函數(shù)就叫轉(zhuǎn)換構(gòu)造函數(shù)。轉(zhuǎn)換構(gòu)造函數(shù)把別的數(shù)據(jù)類(lèi)型的對(duì)象轉(zhuǎn)換為該類(lèi)的一個(gè)對(duì)象。和其他構(gòu)造函數(shù)一樣,如果聲明類(lèi)的對(duì)象的初始化表同轉(zhuǎn)換構(gòu)造函數(shù)的參數(shù)表相匹配,該函數(shù)就會(huì)被調(diào)用。當(dāng)在需要使用該類(lèi)的地方使用了別的數(shù)據(jù)類(lèi)型,便宜器就會(huì)調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行轉(zhuǎn)換。

  #include iostream.h

  #include time.h

  #include stdio.h

  class Date

  {

  int mo, da, yr;

  public:

  Date(time_t);

  void display();

  };

  void Date::display()

  {

  char year[5];

  if(yr<10)

  sprintf(year,0%d,yr);

  else

  sprintf(year,%d,yr);

  cout< }

  Date::Date(time_t now)

  {

  tm* tim=localtime(&now);

  da=tim->tm_mday;

  mo=tim->tm_mon+1;

  yr=tim->tm_year;

  if(yr>=100) yr-=100;

  }

  int main()

  {

  time_t now=time(0);

  Date dt(now);

  dt.display();

  return 0;

  }

  本程序先調(diào)用time()函數(shù)來(lái)獲取當(dāng)前時(shí)間,并把它賦給time_t對(duì)象;然后程序通過(guò)調(diào)用Date類(lèi)的轉(zhuǎn)換構(gòu)造函數(shù)來(lái)創(chuàng)建一個(gè)Date對(duì)象,該對(duì)象由time_t對(duì)象轉(zhuǎn)換而來(lái)。time_t對(duì)象先傳遞給localtime()函數(shù),然后返回一個(gè)指向tm結(jié)構(gòu)(time.h文件中聲明)的指針,然后構(gòu)造函數(shù)把結(jié)構(gòu)中的日月年的數(shù)值拷貝給Date對(duì)象的數(shù)據(jù)成員,這就完成了從time_t對(duì)象到Date對(duì)象的轉(zhuǎn)換。

  二、成員轉(zhuǎn)換函數(shù)

  成員轉(zhuǎn)換函數(shù)把該類(lèi)的對(duì)象轉(zhuǎn)換為其他數(shù)據(jù)類(lèi)型的對(duì)象。在成員轉(zhuǎn)換函數(shù)的聲明中要用到關(guān)鍵字operator。這樣聲明一個(gè)成員轉(zhuǎn)換函數(shù):

  operator aaa();

  在這個(gè)例子中,aaa就是要轉(zhuǎn)換成的數(shù)據(jù)類(lèi)型的說(shuō)明符。這里的類(lèi)型說(shuō)明符可以是任何合法的C++類(lèi)型,包括其他的類(lèi)。如下來(lái)定義成員轉(zhuǎn)換函數(shù);

  Classname::operator aaa()

  類(lèi)名標(biāo)識(shí)符是聲明了該函數(shù)的類(lèi)的類(lèi)型說(shuō)明符。上面定義的Date類(lèi)并不能把該類(lèi)的對(duì)象轉(zhuǎn)換回time_t型變量,但可以把它轉(zhuǎn)換成一個(gè)長(zhǎng)整型值,計(jì)算從2000年1月1日到現(xiàn)在的天數(shù)。

  #include iostream.h

  class Date

  {

  int mo,da,yr;

  public:

  Date(int m,int d,int y) {mo=m; da=d; yr=y;}

  operator int(); //聲明

  };

  Date::operator int() //定義

  {

  static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};

  int days=yr-2000;

  days*=365;

  days+=(yr-2000)/4;

  for(int i=0;i days+=dys[i];

  days+=da;

  return days;

  }

  int main()

  {

  Date now(12,24,2003);

  int since=now;

  cout< return 0;

  }

  三、類(lèi)的轉(zhuǎn)換

  上面兩個(gè)例子都是C++類(lèi)對(duì)象和內(nèi)部數(shù)據(jù)對(duì)象之間的相互轉(zhuǎn)換。也可以定義轉(zhuǎn)換函數(shù)來(lái)實(shí)現(xiàn)兩個(gè)類(lèi)對(duì)象之間的相互轉(zhuǎn)換。

  #include iostream.h

  class CustomDate

  {

  public:

  int da, yr;

  CustomDate(int d=0,int y=0) {da=d; yr=y;}

  void display()

  {

  cout< }

  };

  class Date

  {

  int mo, da, yr;

  public:

  Date(int m=0,int d=0,int y=0) {mo=m; da=d; yr=y;}

  Date(const CustomDate&); //轉(zhuǎn)換構(gòu)造函數(shù)

  operator CustomDate(); //成員轉(zhuǎn)換函數(shù)

  void display()

  {

  cout< }

  };

  static int dys[] = {31,28,31,30,31,30,31,31,30,31,30,31};

  Date::Date(const CustomDate& jd)

  {

  yr=jd.yr;

  da=jd.da;

  for(mo=0;mo<11;mo++)

  if(da>dys[mo]) da-=dys[mo];

  else break;

  mo++;

  }

  Date::operator CustomDate()

  {

  CustomDate cd(0,yr);

  for(int i=0;i cd.da+=da;

  return cd;

  }

  int main()

  {

  Date dt(12,24,3);

  CustomDate cd;

  cd = dt; //調(diào)用成員轉(zhuǎn)換函數(shù)

  cd.display();

  dt = cd; //調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)

  dt.display();

  return 0;

  }

  這個(gè)例子中有兩個(gè)類(lèi)CustomDate和Date,CustomDate型日期包含年份和天數(shù)。

  這個(gè)例子沒(méi)有考慮閏年情況。但是在實(shí)際構(gòu)造一個(gè)類(lèi)時(shí),應(yīng)該考慮到所有問(wèn)題的可能性。

  在Date里中具有兩種轉(zhuǎn)換函數(shù),這樣,當(dāng)需要從Date型變?yōu)镃ustomDate型十,可以調(diào)用成員轉(zhuǎn)換函數(shù);反之可以調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)。

  不能既在Date類(lèi)中定義成員轉(zhuǎn)換函數(shù),又在CustomDate類(lèi)里定義轉(zhuǎn)換構(gòu)造函數(shù)。那樣編譯器在進(jìn)行轉(zhuǎn)換時(shí)就不知道該調(diào)用哪一個(gè)函數(shù),從而出錯(cuò).

  四、轉(zhuǎn)換函數(shù)的調(diào)用

  C++里調(diào)用轉(zhuǎn)換函數(shù)有三種形式:第一種是隱式轉(zhuǎn)換,例如編譯器需要一個(gè)Date對(duì)象,而程序提供的是CustomDate對(duì)象,編譯器會(huì)自動(dòng)調(diào)用合適的轉(zhuǎn)換函數(shù)。另外兩種都是需要在程序代碼中明確給出的顯式轉(zhuǎn)換。C++強(qiáng)制類(lèi)型轉(zhuǎn)換是一種,還有一種是顯式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)和成員轉(zhuǎn)換函數(shù)。下面的程序給出了三中轉(zhuǎn)換形式:

  #include iostream.h

  class CustomDate

  {

  public:

  int da, yr;

  CustomDate(int d=0,int y=0) {da=d; yr=y;}

  void display()

  {

  cout< }

  };

  class Date

  {

  int mo, da, yr;

  public:

  Date(int m,int d,int y)

  {

  mo=m; da=d; yr=y;

  }

  operator CustomDate();

  };

  Date::operator CustomDate()

  {

  static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};

  CustomDate cd(0,yr);

  for(int i=0;i cd.da+=da;

  return cd;

  }

  int main()

  {

  Date dt(11,17,89);

  CustomDate cd;

  cd = dt;

  cd.display();

  cd = (CustomDate) dt;

  cd.display();

  cd = CustomDate(dt);

  cd.display();

  return 0;

  }

  五、轉(zhuǎn)換發(fā)生的情形

  上面的幾個(gè)例子都是通過(guò)不能類(lèi)型對(duì)象之間的相互賦值來(lái)調(diào)用轉(zhuǎn)換函數(shù),還有幾種調(diào)用的可能:

  參數(shù)傳遞

  初始化

  返回值

  表達(dá)式語(yǔ)句

  這些情況下,都有可能調(diào)用轉(zhuǎn)換函數(shù)。

  下面的程序不難理解,就不分析了。

  #include iostream.h

  class CustomDate

  {

  public:

  int da, yr;

  CustomDate() {}

  CustomDate(int d,int y) { da=d; yr=y;}

  void display()

  {

  cout< }

  };

  class Date

  {

  int mo, da, yr;

  public:

  Date(int m,int d,int y) { mo=m; da=d; yr=y; }

  operator CustomDate();

  };

  Date::operator CustomDate()

  {

  static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};

  CustomDate cd(0,yr);

  for (int i=0;i cd.da+=da;

  return cd;

  }

  class Tester

  {

  CustomDate cd;

  public:

  explicit Tester(CustomDate c) { cd=c; }

  void display() { cd.display(); }

  };

  void dispdate(CustomDate cd)

  {

  cd.display();

  }

  CustomDate rtndate()

  {

  Date dt(9,11,1);

  return dt;

  }

  int main()

  {

  Date dt(12,24,3);

  CustomDate cd;

  cd = dt;

  cd.display();

  dispdate(dt);

  Tester ts(dt);

  ts.display();

  cd = rtndate();

  cd.display();

  return 0;

  }

  六、顯式構(gòu)造函數(shù)

  注意上面Tester類(lèi)的構(gòu)造函數(shù)前面有一個(gè)explicit修飾符。如果不加上這個(gè)關(guān)鍵字,那么在需要把CustomDate對(duì)象轉(zhuǎn)換成Tester對(duì)象時(shí),編譯器會(huì)把該函數(shù)當(dāng)作轉(zhuǎn)換構(gòu)造函數(shù)來(lái)調(diào)用。但是有時(shí)候,并不想把這種只有一個(gè)參數(shù)的構(gòu)造函數(shù)用于轉(zhuǎn)換目的,而僅僅希望用它來(lái)顯式地初始化對(duì)象,此時(shí),就需要在構(gòu)造函數(shù)前加explicit。如果在聲明了Tester對(duì)象以后使用了下面的語(yǔ)句將導(dǎo)致一個(gè)錯(cuò)誤:

  ts=jd; //error

  這個(gè)錯(cuò)誤說(shuō)明,雖然Tester類(lèi)中有一個(gè)以Date型變量為參數(shù)的構(gòu)造函數(shù),編譯器卻不會(huì)把它看作是從Date到Tester的轉(zhuǎn)換構(gòu)造函數(shù),因?yàn)樗穆暶髦邪薳xplicit修飾符。

  七、表達(dá)式內(nèi)部的轉(zhuǎn)換

  在表達(dá)式內(nèi)部,如果發(fā)現(xiàn)某個(gè)類(lèi)型和需要的不一致,就會(huì)發(fā)生錯(cuò)誤。數(shù)字類(lèi)型的轉(zhuǎn)換是很簡(jiǎn)單,這里就不舉例了。下面的程序是把Date對(duì)象轉(zhuǎn)換成長(zhǎng)整型值。

  #include iostream.h

  class Date

  {

  int mo, da, yr;

  public:

  Date(int m,int d,int y)

  {

  mo=m; da=d; yr=y;

  }

  operator long();

  };

  Date::operator long()

  {

  static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};

  long days=yr;

  days*=365;

  days+=(yr-1900)/4; //從1900年1月1日開(kāi)始計(jì)算

  for(int i=0;i days+=da;

  return days;

  }

  int main()

  {

  Date today(12,24,2003);

  const long ott=123;

  long sum=ott+today;

  cout< return 0;

  }

  在表達(dá)式中,當(dāng)需要轉(zhuǎn)換的對(duì)象可以轉(zhuǎn)換成某個(gè)數(shù)字類(lèi)型,或者表達(dá)式調(diào)用了作用于某個(gè)類(lèi)的重載運(yùn)算符時(shí),就會(huì)發(fā)生隱式轉(zhuǎn)換。運(yùn)算符重載以后再學(xué)習(xí)。

掃描/長(zhǎng)按二維碼幫助考試通關(guān)
2017等考成績(jī)查詢(xún)時(shí)間
2017等考各科通關(guān)技巧
2017各科最新預(yù)測(cè)試卷
2017等考成績(jī)?cè)u(píng)定及管理

微信搜索"考試吧"了解更多考試資訊、下載備考資料

  相關(guān)推薦:

  2017年全國(guó)計(jì)算機(jī)等級(jí)考試時(shí)間|教材目錄(2017年版)

  2017年9月計(jì)算機(jī)等級(jí)考試真題|計(jì)算機(jī)等級(jí)考試答案

  各地2017年9月計(jì)算機(jī)等考成績(jī)查詢(xún)時(shí)間|免費(fèi)查分提醒

  計(jì)算機(jī)等級(jí)考試成績(jī)?cè)u(píng)定流程及標(biāo)準(zhǔn)|合格證書(shū)樣本及證書(shū)說(shuō)明

  歷年真題匯總|考試吧特別策劃:2017年計(jì)算機(jī)等級(jí)考試報(bào)考指南

0
收藏該文章
0
收藏該文章
文章搜索
萬(wàn)題庫(kù)小程序
萬(wàn)題庫(kù)小程序
·章節(jié)視頻 ·章節(jié)練習(xí)
·免費(fèi)真題 ·?荚囶}
微信掃碼,立即獲取!
掃碼免費(fèi)使用
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
此欄目下沒(méi)有文章
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
Copyright © 2004- 考試吧計(jì)算機(jī)等級(jí)考試網(wǎng) 出版物經(jīng)營(yíng)許可證新出發(fā)京批字第直170033號(hào) 
京ICP證060677 京ICP備05005269號(hào) 中國(guó)科學(xué)院研究生院權(quán)威支持(北京)
在線模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧