青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++分析研究  
C++
日歷
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
統(tǒng)計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
  在C++中為什么輸入輸出流不能重載為類成員函數(shù)?

  假如說operator 《 ()這是一個成員函數(shù),mealtime是一個類Time的私有成員,那么如我們看到的,如下一個輸出語句:cout《mealtime;將被編譯器處理為發(fā)送一條消息到cout,cout.operator《(mealtime);這表示operator 《必須是類ostream的一個成員,而不是類Time的一個成員。然而,即使能將這個新函數(shù)添加到標(biāo)準(zhǔn)ostream中,仍然不希望破壞標(biāo)準(zhǔn)的庫,因此operator 《必然是一個普通函數(shù),這表示如下輸出語句:cout《mealtime將被編譯器看作函數(shù)調(diào)用operator《(cout,mealtime);這樣operator《()必須具有兩個形參,第一個是ostream類,第二個是Timer類。

  大部份的標(biāo)準(zhǔn)庫實(shí)現(xiàn)中,對ostream,istream類體系采用了構(gòu)造函數(shù)保護(hù)繼承的方式……致使即使以繼承的方式來擴(kuò)展流類,也會在對象實(shí)例化時遭遇阻礙……

  另一方面,標(biāo)準(zhǔn)庫中的流類,其插入符函數(shù)沒有聲明為虛函數(shù),因此子類不能對其實(shí)現(xiàn)進(jìn)行覆蓋,所以也使成員函數(shù)重載遭遇到實(shí)質(zhì)的困難……

  總的來說,C++標(biāo)準(zhǔn)I/O庫非常繁雜且難,其實(shí)現(xiàn)思想很多都與常規(guī)的OOP有所出入……在使用的時候要謹(jǐn)慎,并最好遵從慣例……

  為什么C++賦值運(yùn)算符不能被繼承?

  1,每一個類對象實(shí)例在創(chuàng)建的時候,如果用戶沒有定義“賦值運(yùn)算符重載函數(shù)”,那么,編譯器會自動生成一個隱含和默認(rèn)的“賦值運(yùn)算符重載函數(shù)”。所以,B1的實(shí)際上的聲明應(yīng)該類似于下面這種情況:

  class A1

  {

  public:

  int operator=(int a)

  {

  return 8;

  }

  int operator+(int a)

  {

  return 9;

  }

  };

  class B1 : public A1

  {

  public:

  B1& operator =(const B1& robj); // 注意這一行是編譯器添加的

  int operator-(int a)

  {

  return 7;

  }

  };

  2,C++標(biāo)準(zhǔn)規(guī)定:如果派生類中聲明的成員與基類的成員同名,那么,基類的成員會被覆蓋,哪怕基類的成員與派生類的成員的數(shù)據(jù)類型和參數(shù)個數(shù)都完全不同。顯然,B1中的賦值運(yùn)算符函數(shù)名operator =和基類A1中的operator =同名,所以,A1中的賦值運(yùn)算符函數(shù)int operator=(int a);被B1中的隱含的賦值運(yùn)算符函數(shù)B1& operator =(const B1& robj);所覆蓋。 A1中的int operator=(int a);函數(shù)無法被B1對象訪問。 www.liuhebao.com

  3,程序中語句v = 2實(shí)際上相當(dāng)于v.operator =(2);,但是A1中的int operator=(int a);已經(jīng)被覆蓋,無法訪問。而B1中默認(rèn)的B1& operator =(const B1& robj);函數(shù)又與參數(shù)2的整數(shù)類型不相符,無法調(diào)用。

  4,為了確認(rèn)B1中默認(rèn)的B1& operator =(const B1& robj);函數(shù)的存在性,可以用以下代碼驗證:

  B1 b;

  B1 v;

  v = b; // OK, 相當(dāng)于調(diào)用v.operator =(b);STA

  5,所以,“賦值運(yùn)算符重載函數(shù)”不是不能被派生類繼承,而是被派生類的默認(rèn)“賦值運(yùn)算符重載函數(shù)”給覆蓋了。

  這就是C++賦值運(yùn)算符重載函數(shù)不能被派生類繼承的真實(shí)原因!

  關(guān)于本帖問題正確性的解釋

  C++程序員的必讀經(jīng)典《Effective C++》這么說:

  條款45: 弄清C++在幕后為你所寫、所調(diào)用的函數(shù)

  一個空類什么時候不是空類? ---- 當(dāng)C++編譯器通過它的時候。如果你沒有聲明下列函數(shù),體貼的編譯器會聲明它自己的版本。這些函數(shù)是:一個拷貝構(gòu)造函數(shù),一個賦值運(yùn)算符,一個析構(gòu)函數(shù),一對取址運(yùn)算符。另外,如果你沒有聲明任何構(gòu)造函數(shù),它也將為你聲明一個缺省構(gòu)造函數(shù)。所有這些函數(shù)都是公有的。換句話說,如果你這么寫:

  class Empty{};

  和你這么寫是一樣的:

  class Empty {

  public:

  Empty(); // 缺省構(gòu)造函數(shù)

  Empty(const Empty& rhs); // 拷貝構(gòu)造函數(shù)

  ~Empty(); // 析構(gòu)函數(shù) ---- 是否

  // 為虛函數(shù)看下文說明

  Empty&

  operator=(const Empty& rhs); // 賦值運(yùn)算符

  Empty* operator&(); // 取址運(yùn)算符

  const Empty* operator&() const;

  };

  但是Effective C++依然不能作為最后的判決。讓我們從C++的“憲法”中尋找答案…

  ISO/IEC 14882是C++的國際標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)于1998年9月1日通過并且定案。當(dāng)然,這個標(biāo)準(zhǔn)已經(jīng)不是最新標(biāo)準(zhǔn)了,但這個標(biāo)準(zhǔn)卻是目前最被廣泛支持的C++標(biāo)準(zhǔn)。所以,我一向稱之為C++的“憲法”。

  C++“憲法”第12章 Special Member Functions (第185頁)開宗明義:

  The default constructor, copy constructor and copy assignment operator, and destructor are special member functions. The implementation will implicitly declare these member functions for a class type when the program does not explicitly declare them, except as noted in 12.1. The implementation will implicitly define then if they are used, as specified in 12.1, 12.4 and 12.8. Programs shall not define implicitly-declared special member functions. Programs may explicitly refer to implicitly declared special member functions.

  譯文:

  缺省構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),拷貝賦值函數(shù),以及析構(gòu)函數(shù)這四種成員函數(shù)被稱作特殊的成員函數(shù)。如果用戶程序沒有顯式地聲明這些特殊的成員函數(shù),那么編譯器實(shí)現(xiàn)將隱式地聲明它們。12.1中有特別解釋的例外。如果用戶程序調(diào)用了這些特殊的成員函數(shù),那么編譯器就會定義這些特殊的成員函數(shù),在12.1,12.4,12.8中分別規(guī)定了編譯器對這些函數(shù)的定義方式。用戶程序不能定義隱式聲明的特殊成員函數(shù)。用戶程序可以顯式地調(diào)用隱式聲明的特殊成員函數(shù)。

  譯注:

  根據(jù)C++標(biāo)準(zhǔn)的規(guī)定:

  聲明(Declare)代表頭文件中的那部分代碼,比如下面就是一個聲明:

  class A

  {

  public:

  A();

  }

  定義(Define)代表源文件中的代碼,比如下面就是一個定義:

  A::A()

  {}

  綜上所述,可知,第一個說法是正確的。

  關(guān)于第二個說法的正確性,可參見C++“憲法”3.3.7 Name Hiding (第28頁)(由于我手上的C++“憲法”是掃描版,無法直接拷貝文字,且文字較多,懶得輸入了。)

  第3,4,5點(diǎn)說法都是常識性的知識,可以直接驗證。
posted on 2012-11-26 18:14 HAOSOLA 閱讀(266) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品亚洲热| 欧美成人午夜77777| 国产精品一二三| 亚洲手机视频| 亚洲欧美日韩系列| 好吊一区二区三区| 欧美大片在线观看| 欧美激情一区在线| 亚洲视频axxx| 亚洲欧美影院| 亚洲国产精品久久91精品| 欧美高清在线视频| 欧美视频三区在线播放| 欧美一区二区在线播放| 久久国产欧美日韩精品| 亚洲精品1234| 在线视频日韩精品| 韩国在线视频一区| 亚洲欧洲综合另类在线| 欧美日韩国产三级| 久久9热精品视频| 麻豆久久久9性大片| 中文国产亚洲喷潮| 欧美一区三区二区在线观看| 亚洲第一成人在线| 一区二区三区欧美成人| 国内偷自视频区视频综合| 亚洲成人在线网| 国产精品极品美女粉嫩高清在线| 久久国产精品久久久久久电车| 久久手机精品视频| 亚洲综合精品| 蜜桃久久精品乱码一区二区| 在线中文字幕不卡| 久久久99精品免费观看不卡| 一区二区久久久久| 久久久www成人免费无遮挡大片 | 小处雏高清一区二区三区| 一区在线免费| 亚洲一区久久| 99精品国产在热久久婷婷| 午夜一区二区三视频在线观看| 亚洲欧洲日产国码二区| 欧美亚洲系列| 亚洲一区二区三区四区五区午夜| 久久久久久伊人| 欧美一区二区视频97| 欧美区高清在线| 欧美成在线视频| 国产综合色产在线精品| 一区二区三欧美| 亚洲精品欧美日韩专区| 久久精品日韩欧美| 欧美永久精品| 国产精品日韩久久久久| 日韩西西人体444www| 亚洲美女av网站| 免费亚洲一区二区| 男女激情久久| 在线欧美小视频| 久久久午夜电影| 久久久久久一区二区| 国产欧美视频一区二区| 亚洲综合色丁香婷婷六月图片| 国产精品99久久不卡二区| 欧美日本不卡视频| 亚洲精品一区二区在线观看| 亚洲精品日日夜夜| 欧美二区视频| 亚洲欧洲偷拍精品| 日韩视频免费观看高清在线视频| 另类酷文…触手系列精品集v1小说| 久久久精品国产99久久精品芒果| 国产欧美高清| 久久精品国产亚洲一区二区三区 | 亚洲国产成人精品久久| 久久久人成影片一区二区三区观看| 久久久久久免费| 依依成人综合视频| 美女福利精品视频| 亚洲人成绝费网站色www| 一区二区三区鲁丝不卡| 欧美三级电影网| 亚洲欧美日韩在线不卡| 久久久777| 亚洲电影免费在线 | 久久蜜臀精品av| 欧美国产第一页| 中文欧美字幕免费| 国产精品一香蕉国产线看观看 | 日韩视频在线免费观看| 亚洲午夜视频| 国产亚洲精品高潮| 嫩草伊人久久精品少妇av杨幂| 91久久精品国产91久久| 亚洲一区免费| 国语自产精品视频在线看一大j8| 玖玖精品视频| 日韩视频免费| 久久午夜羞羞影院免费观看| 亚洲欧洲另类国产综合| 国产精品福利在线观看| 久久国产综合精品| 亚洲精品中文在线| 久久一区视频| 一二三区精品| 一区精品在线播放| 国产精品va| 久久综合色一综合色88| 亚洲一区二区三区三| 欧美不卡在线| 欧美制服丝袜| 亚洲图片在线观看| 亚洲成色www8888| 国产精品免费网站在线观看| 久久久久免费| 亚洲欧美精品中文字幕在线| 最新国产乱人伦偷精品免费网站 | 在线日韩中文| 国产欧美婷婷中文| 欧美日韩一区二区视频在线| 久久久精品五月天| 亚洲与欧洲av电影| 91久久久久久国产精品| 久久久综合香蕉尹人综合网| 中文精品一区二区三区| 亚洲欧洲三级电影| 在线观看欧美视频| 国产欧美一区二区视频| 欧美三级乱人伦电影| 牛牛国产精品| 久久在线免费观看| 久久久国产精品一区| 欧美一级专区免费大片| 中文精品一区二区三区| 日韩午夜av电影| 最新日韩中文字幕| 欧美激情亚洲另类| 牛人盗摄一区二区三区视频| 久久久夜夜夜| 久久久蜜桃精品| 久久久亚洲欧洲日产国码αv | 制服丝袜亚洲播放| 夜夜爽av福利精品导航| 亚洲欧洲另类国产综合| 亚洲激情视频在线播放| 亚洲国产精品一区二区www| 亚洲第一精品福利| 亚洲国产精品久久久| 亚洲国产婷婷香蕉久久久久久| 精品成人久久| 亚洲国产精彩中文乱码av在线播放| 好吊色欧美一区二区三区视频| 国产在线一区二区三区四区| 狠狠色丁香久久婷婷综合丁香 | 国产欧美一区二区色老头| 国产精品久久网| 国产欧美日韩一区二区三区在线| 国产噜噜噜噜噜久久久久久久久 | 国产精品久久久久久久第一福利| 欧美日韩一区二| 国产精品青草久久| 国产日韩在线不卡| 亚洲电影欧美电影有声小说| 亚洲经典自拍| 亚洲一区二区精品在线| 欧美一区国产二区| 免费的成人av| 日韩视频一区二区在线观看| 亚洲永久在线观看| 久久综合给合| 欧美日韩三区四区| 国产日韩精品一区二区三区在线| 一区二区三区在线观看国产| 亚洲人成在线观看一区二区| 亚洲综合丁香| 你懂的视频一区二区| 99国产欧美久久久精品| 欧美在线日韩| 欧美精品videossex性护士| 国产精品一区二区久久| 亚洲国产99| 午夜精品久久| 欧美激情1区2区3区| 一本色道久久综合亚洲精品高清 | 欧美日韩一区二区在线| 国产精品尤物| 亚洲韩国青草视频| 亚洲欧美一区二区激情| 免费短视频成人日韩| 一区二区三区你懂的| 久久亚洲精品一区| 国产精品美女久久| 亚洲精品欧美| 久久天天躁狠狠躁夜夜av| 亚洲精品午夜精品| 久久蜜臀精品av| 国产精品一区二区三区四区| 亚洲欧洲在线观看| 欧美在线视频不卡|