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

C++分析研究  
C++
日歷
<2012年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

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

  大部份的標準庫實現中,對ostream,istream類體系采用了構造函數保護繼承的方式……致使即使以繼承的方式來擴展流類,也會在對象實例化時遭遇阻礙……

  另一方面,標準庫中的流類,其插入符函數沒有聲明為虛函數,因此子類不能對其實現進行覆蓋,所以也使成員函數重載遭遇到實質的困難……

  總的來說,C++標準I/O庫非常繁雜且難,其實現思想很多都與常規的OOP有所出入……在使用的時候要謹慎,并最好遵從慣例……

  為什么C++賦值運算符不能被繼承?

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

  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++標準規定:如果派生類中聲明的成員與基類的成員同名,那么,基類的成員會被覆蓋,哪怕基類的成員與派生類的成員的數據類型和參數個數都完全不同。顯然,B1中的賦值運算符函數名operator =和基類A1中的operator =同名,所以,A1中的賦值運算符函數int operator=(int a);被B1中的隱含的賦值運算符函數B1& operator =(const B1& robj);所覆蓋。 A1中的int operator=(int a);函數無法被B1對象訪問。 www.liuhebao.com

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

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

  B1 b;

  B1 v;

  v = b; // OK, 相當于調用v.operator =(b);STA

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

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

  關于本帖問題正確性的解釋

  C++程序員的必讀經典《Effective C++》這么說:

  條款45: 弄清C++在幕后為你所寫、所調用的函數

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

  class Empty{};

  和你這么寫是一樣的:

  class Empty {

  public:

  Empty(); // 缺省構造函數

  Empty(const Empty& rhs); // 拷貝構造函數

  ~Empty(); // 析構函數 ---- 是否

  // 為虛函數看下文說明

  Empty&

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

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

  const Empty* operator&() const;

  };

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

  ISO/IEC 14882是C++的國際標準。該標準于1998年9月1日通過并且定案。當然,這個標準已經不是最新標準了,但這個標準卻是目前最被廣泛支持的C++標準。所以,我一向稱之為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.

  譯文:

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

  譯注:

  根據C++標準的規定:

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

  class A

  {

  public:

  A();

  }

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

  A::A()

  {}

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

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

  第3,4,5點說法都是常識性的知識,可以直接驗證。
posted on 2012-11-26 18:14 HAOSOLA 閱讀(262) 評論(0)  編輯 收藏 引用
 
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>
            午夜精品国产精品大乳美女| 亚洲欧美一区二区三区在线| 99av国产精品欲麻豆| 午夜激情亚洲| 国产精品xxx在线观看www| 亚洲区在线播放| 欧美+亚洲+精品+三区| 欧美在线啊v| 国产一区二区精品在线观看| 午夜日韩在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美精品久久99| 日韩午夜免费视频| 亚洲人成在线观看网站高清| 麻豆av福利av久久av| 影院欧美亚洲| 亚洲国产天堂久久综合| 欧美激情视频一区二区三区不卡| 亚洲日本免费电影| 最新日韩中文字幕| 欧美日韩视频在线一区二区 | 欧美一区二区三区四区夜夜大片 | 欧美日韩一区二区三| 亚洲免费av电影| 日韩系列在线| 国产精品区二区三区日本| 欧美一区二区高清在线观看| 午夜精品久久久久影视| 亚洲区国产区| 日韩午夜激情| 国产精品美女久久久久久2018| 午夜精品久久久久久久99樱桃 | 亚洲日本欧美天堂| 欧美日韩在线一区二区三区| 午夜在线精品偷拍| 久久久99精品免费观看不卡| 亚洲精品免费电影| 亚洲一区日韩在线| 在线不卡免费欧美| 亚洲欧洲精品一区二区三区| 欧美三级视频在线| 久久久久女教师免费一区| 欧美国产91| 欧美一区二区视频网站| 久久亚洲综合色| 亚洲一区成人| 久久综合福利| 欧美一区二区三区免费大片| 欧美aⅴ一区二区三区视频| 亚洲一区三区在线观看| 久久大逼视频| 宅男精品导航| 久久午夜羞羞影院免费观看| 亚洲在线视频| 欧美高清在线| 久久久之久亚州精品露出| 欧美日韩国产片| 久久一二三区| 国产精品香蕉在线观看| 亚洲激情校园春色| 激情六月婷婷久久| 亚洲免费视频中文字幕| 一区二区三区国产盗摄| 免费91麻豆精品国产自产在线观看| 午夜精品在线视频| 欧美精品性视频| 欧美国产精品久久| 国产一区二区av| 亚洲夜晚福利在线观看| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲欧美日韩国产精品| 一区二区三区四区五区视频| 美女视频网站黄色亚洲| 久久偷看各类wc女厕嘘嘘偷窃| 欧美视频一区二区三区…| 亚洲电影在线播放| 伊人色综合久久天天五月婷| 欧美亚洲一区在线| 欧美在线综合视频| 国产精品资源在线观看| 中日韩午夜理伦电影免费| 一区二区三区毛片| 欧美日本不卡高清| 最新成人在线| 一区二区高清在线| 欧美日韩成人综合| 亚洲狠狠婷婷| 日韩视频在线播放| 欧美高清视频在线 | 亚洲一级电影| 欧美视频精品在线观看| 亚洲欧洲偷拍精品| 亚洲精品一区二区三区婷婷月| 久久夜色精品国产亚洲aⅴ| 麻豆成人在线观看| 亚洲国产91精品在线观看| 久久尤物视频| 亚洲福利国产精品| 亚洲精品国产精品国自产观看| 男女激情视频一区| 亚洲高清久久| 一本色道久久88综合亚洲精品ⅰ | 一区二区三区日韩欧美精品| 欧美精品在线一区二区三区| 亚洲三级网站| 亚洲一区二区三区成人在线视频精品| 欧美天堂亚洲电影院在线播放| 中文精品视频一区二区在线观看| 午夜伦理片一区| 国内揄拍国内精品少妇国语| 另类亚洲自拍| 日韩视频精品在线| 欧美怡红院视频一区二区三区| 国产在线视频欧美一区二区三区| 久热精品在线| 一本一本久久| 久久夜色撩人精品| 亚洲精品之草原avav久久| 欧美日韩一区二区三区四区在线观看 | 亚洲大片在线| 99国产精品自拍| 国产乱码精品一区二区三| 久久久亚洲人| 日韩视频中文字幕| 久久男女视频| 一区二区av在线| 狠狠色狠狠色综合人人| 欧美激情一区二区久久久| 亚洲网站在线观看| 欧美大片免费久久精品三p| 亚洲一区二区三区欧美| 激情久久一区| 国产精品欧美久久久久无广告| 久久综合图片| 亚洲自啪免费| 亚洲日产国产精品| 久久av资源网站| 一区二区三区高清| 亚洲第一精品影视| 国产精品一区二区在线| 欧美成人一区二区三区| 欧美一区二视频| 中文久久精品| 亚洲黄色一区二区三区| 久热这里只精品99re8久| 亚洲免费影视| 日韩特黄影片| **性色生活片久久毛片| 国产欧美日韩91| 欧美日韩在线亚洲一区蜜芽| 嫩草国产精品入口| 久久久精品国产一区二区三区| 日韩一级精品| 最新中文字幕一区二区三区| 亚洲一区激情| 久久婷婷国产麻豆91天堂| 亚洲深夜福利网站| 亚洲精品三级| 伊人精品视频| 国产一级一区二区| 国产欧美日韩精品a在线观看| 欧美成人一品| 欧美www视频在线观看| 久久久久国产一区二区三区四区| 午夜国产精品视频| 亚洲欧美久久久久一区二区三区| 夜夜狂射影院欧美极品| 亚洲精品少妇30p| 亚洲国产成人av好男人在线观看| 免费不卡视频| 你懂的成人av| 久久亚洲二区| 美女黄毛**国产精品啪啪 | 久久久久久夜| 欧美在线观看日本一区| 亚洲欧美成人一区二区三区| 亚洲午夜一区二区| 亚洲在线国产日韩欧美| 午夜激情一区| 久久精品国产一区二区三区免费看 | 久久深夜福利免费观看| 久久精品视频一| 久久青青草原一区二区| 久久综合99re88久久爱| 欧美不卡一卡二卡免费版| 欧美成人免费在线观看| 欧美经典一区二区三区| 欧美日韩亚洲一区二区三区四区| 欧美色欧美亚洲高清在线视频| 欧美体内谢she精2性欧美| 国产精品久久一卡二卡| 国产亚洲一级高清| 一区二区在线视频| 亚洲国产一区二区三区青草影视| 亚洲欧洲精品一区二区| 亚洲视频1区| 久久久精品动漫| 亚洲大片在线| 亚洲一区二区三区精品在线 | 国产九区一区在线|