人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

C++的風格與技巧

C++的風格與技巧

更新時間:2022-07-10 文章作者:未知 信息來源:網絡 閱讀次數:

Bjarne Stroustrup的FAQ:C++的風格與技巧

  翻譯:左輕侯

  http://www.wushuang.net/article/bsfaq.htm

  (譯注:本文的翻譯相當艱苦。Bjarne Stroustrup不愧是創立C++語言的一代大師,不但思想博大精深,而且在遣詞造句上,也非常精微深奧。有很多地方,譯者反復斟酌,都不能取得理想的效果,只能盡力而為。

  Html格式的文檔見譯者主頁:http://www.wushuang.net

  如果你對這個翻譯稿有任何意見和建議,請發信給譯者:onekey@163.com。

  原文的地址為:http://www.research.att.com/~bs/bs_faq2.html)

  (Bjarne Stroustrup博士,1950年出生于丹麥,先后畢業于丹麥阿魯斯大學和英國劍撟大學,AT&T大規模程序設計研究部門負責人,AT&T 貝爾實驗室和ACM成員。1979年,B. S開始開發一種語言,當時稱為"C with Class",后來演化為C++。1998年,ANSI/ISO C++標準建立,同年,B. S推出其經典著作The C++ Programming Language的第三版。)

  這是一些人們經常向我問起的有關C++的風格與技巧的問題。如果你能提出更好的問題,或者對這些答案有所建議,請務必發Email給我(bs@research.att.com)。請記住,我不能把全部的時間都花在更新我的主頁上面。

  更多的問題請參見我的general FAQ。

  關于術語和概念,請參見我的C++術語表(C++ glossary.)。

  請注意,這僅僅是一個常見問題與解答的列表。它不能代替一本優秀教科書中那些經過精心挑選的范例與解釋。它也不能象一本參考手冊或語言標準那樣,提供詳細和準確的說明。有關C++的設計的問題,請參見《C++語言的設計和演變》(The Design and Evolution of C++)。關于C++語言與標準庫的使用,請參見《C++程序設計語言》(The C++ Programming Language)。

  目錄:

  我如何寫這個非常簡單的程序?

  為什么編譯要花這么長的時間?

  為什么一個空類的大小不為0?

  我必須在類聲明處賦予數據嗎?

  為什么成員函數默認不是virtual的?

  為什么析構函數默認不是virtual的?

  為什么不能有虛擬構造函數?

  為什么重載在繼承類中不工作?

  我能夠在構造函數中調用一個虛擬函數嗎?

  有沒有“指定位置刪除”(placement delete)?

  我能防止別人繼承我自己的類嗎?

  為什么不能為模板參數定義約束(constraints)?

  既然已經有了優秀的qsort()函數,為什么還需要一個sort()?

  什么是函數對象(function object)?

  我應該如何對付內存泄漏?

  我為什么在捕獲一個異常之后就不能繼續?

  為什么C++中沒有相當于realloc()的函數?

  如何使用異常?

  怎樣從輸入中讀取一個字符串?

  為什么C++不提供“finally”的構造?

  什么是自動指針(auto_ptr),為什么沒有自動數組(auto_array)?

  可以混合使用C風格與C++風格的內存分派與重新分配嗎?

  我為什么必須使用一個造型來轉換*void?

  我如何定義一個類內部(in-class)的常量?

  為什么delete不會將操作數置0?

  我能夠寫“void main()”嗎?

  為什么我不能重載點符號,::,sizeof,等等?

  怎樣將一個整型值轉換為一個字符串?

  “int* p”正確還是“int *p”正確?

  對于我的代碼,哪一種布局風格(layout style)是最好的?

  我應該將“const”放在類型之前還是之后?

  使用宏有什么問題?

  我如何寫這個非常簡單的程序?

  特別是在一個學期的開始,我常常收到許多關于編寫一個非常簡單的程序的詢問。這個問題有一個很具代表性的解決方法,那就是(在你的程序中)讀入幾個數字,對它們做一些處理,再把結果輸出。下面是一個這樣做的例子:

  #include

  #include

  #include

  using namespace std;

  int main()

  {

  vector v;

  double d;

  while(cin>>d) v.push_back(d); // 讀入元素

  if (!cin.eof()) { // 檢查輸入是否出錯

  cerr < "format="" error\n";="">

  return 1; // 返回一個錯誤

  }


  cout < "read="" "="">< v.size()="">< "="" elements\n";="">

  reverse(v.begin(),v.end());

  cout < "elements="" in="" reverse="" order:\n";="">

  for (int i = 0; i

  return 0; // 成功返回

  }



  對這段程序的觀察:

  這是一段標準的ISO C++程序,使用了標準庫(standard library)。標準庫工具在命名空間std中聲明,封裝在沒有.h后綴的頭文件中。

  如果你要在Windows下編譯它,你需要將它編譯成一個“控制臺程序”(console application)。記得將源文件加上.cpp后綴,否則編譯器可能會以為它是一段C代碼而不是C++。

  是的,main()函數返回一個int值。

  讀到一個標準的向量(vector)中,可以避免在隨意確定大小的緩沖中溢出的錯誤。讀到一個數組(array)中,而不產生“簡單錯誤”(silly error),這已經超出了一個新手的能力——如果你做到了,那你已經不是一個新手了。如果你對此表示懷疑,我建議你閱讀我的文章“將標準C++作為一種新的語言來學習”("Learning Standard C++ as a New Language"),你可以在本人著作列表(my publications list)中下載到它。

  !cin.eof()是對流的格式的檢查。事實上,它檢查循環是否終結于發現一個end-of-file(如果不是這樣,那么意味著輸入沒有按照給定的格式)。更多的說明,請參見你的C++教科書中的“流狀態”(stream state)部分。

  vector知道它自己的大小,因此我不需要計算元素的數量。

  這段程序沒有包含顯式的內存管理。Vector維護一個內存中的棧,以存放它的元素。當一個vector需要更多的內存時,它會分配一些;當它不再生存時,它會釋放內存。于是,使用者不需要再關心vector中元素的內存分配和釋放問題。

  程序在遇到輸入一個“end-of-file”時結束。如果你在UNIX平臺下運行它,“end-of-file”等于鍵盤上的Ctrl+D。如果你在Windows平臺下,那么由于一個BUG它無法辨別“end-of-file”字符,你可能傾向于使用下面這個稍稍復雜些的版本,它使用一個詞“end”來表示輸入已經結束。

  #include

  #include

  #include

  #include

  using namespace std;

  int main()

  {

  vector v;

  double d;

  while(cin>>d) v.push_back(d); // 讀入一個元素

  if (!cin.eof()) { // 檢查輸入是否失敗

  cin.clear(); // 清除錯誤狀態

  string s;

  cin >> s; // 查找結束字符

  if (s != "end") {

  cerr < "format="" error\n";="">

  return 1; // 返回錯誤

  }

  }

  cout < "read="" "="">< v.size()="">< "="" elements\n";="">

  reverse(v.begin(),v.end());

  cout < "elements="" in="" reverse="" order:\n";="">

  for (int i = 0; i

  return 0; // 成功返回

  }

  更多的關于使用標準庫將事情簡化的例子,請參見《C++程序設計語言》中的“漫游標準庫”("Tour of the Standard Library")一章。

  為什么編譯要花這么長的時間?

  你的編譯器可能有問題。也許它太老了,也許你安裝它的時候出了錯,也許你用的計算機已經是個古董。在諸如此類的問題上,我無法幫助你。

  但是,這也是很可能的:你要編譯的程序設計得非常糟糕,以至于編譯器不得不檢查數以百計的頭文件和數萬行代碼。理論上來說,這是可以避免的。如果這是你購買的庫的設計問題,你對它無計可施(除了換一個更好的庫),但你可以將你自己的代碼組織得更好一些,以求得將修改代碼后的重新編譯工作降到最少。這樣的設計會更好,更有可維護性,因為它們展示了更好的概念上的分離。

  看看這個典型的面向對象的程序例子:

  class Shape {

  public: // 使用Shapes的用戶的接口

  virtual void draw() const;

  virtual void rotate(int degrees);

  // ...

  protected: // common data (for implementers of Shapes)

  Point center;

  Color col;

  // ...

  };



  class Circle : public Shape {

  public:

  void draw() const;

  void rotate(int) { }

  // ...

  protected:

  int radius;

  // ...

  };



  class Triangle : public Shape {

  public:

  void draw() const;

  void rotate(int);

  // ...

  protected:

  Point a, b, c;

  // ...

  };


  設計思想是,用戶通過Shape的public接口來操縱它們,而派生類(例如Circle和Triangle)的實現部分則共享由protected成員表現的那部分實現(implementation)。

[1] [2] [3] [4]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 栾川县| 昌黎县| 五河县| 宣威市| 长治县| 虎林市| 侯马市| 唐海县| 获嘉县| 四平市| 宁武县| 叶城县| 宾川县| 平和县| 西贡区| 玛多县| 霞浦县| 金沙县| 桐乡市| 肇庆市| 南开区| 苏州市| 白朗县| 石景山区| 宁德市| 麻栗坡县| 台江县| 白沙| 富川| 雷波县| 正安县| 莆田市| 灵璧县| 松江区| 邢台市| 临西县| 慈利县| 阿拉善左旗| 咸阳市| 大余县| 黎川县|