BlueDog 關於標準C++有關問題的解答<二> (轉)

worldblog發表於2007-12-12
BlueDog 關於標準C++有關問題的解答 (轉)[@more@]

BlueDog 關於標準C++有關問題的解答

Author : BlueDog
E- :

/////////////////////////////////////////////////////////////////////////////////// 

// //  原創作品,歡迎轉載,務必註明版權及出處。請在你轉載時加上以下一行  //
//  //
//  BlueDog 原創  出處: ">  :   // 
//  //
/////////////////////////////////////////////////////////////////////////////////

  需要申明的是我是一個C++的菜鳥,這篇文章只是為了與大家交流。以下是我在學習C++中自已提出的一些問題並經過自已的思考,參考MSDN的說明以及檢視VC定義的頭而解答的。當然裡面可能會有錯誤或者解答的不完全,也希望大家指正。沒有太多的想法,一切只是為了大家的共同提高。
 

  一、為什麼在使用String之前需要使用 using namespace std這樣一句?
  Essential C++告訴我標準庫所提供的任何事物,都被封裝在名稱空間std內。這樣子可以避免產生命名衝突。你看到這句話一定想要挖開裡面的東東,看看是如何做的
  很奇怪的我沒有看到我所想要找的
  namespace std {
  ...
  }
  但是我注意到有 _STD_BEGIN 和 _STD_END 在幾乎每個標準庫標頭檔案中。如是我想Microsoft的有宏定義嗜好的程式設計師一定又在用#define這個法寶。我只需查詢_STD_BEGIN的定義就好了。再一次感謝Microsoft在VC中提供的 Find in Files...功能,聽到一陣狂響後我看到了在Yvals.h中定義的STD家族的幾行。(當然你也可以用GREP這個程式來查詢,只是沒有VC這個方便吧了!)
#if defined(__cplusplus)
  #define _STD std::
  #define _STD_BEGIN namespace std {
  #define _STD_END };
  #define _STD_USING
#else
  #define _STD ::
  #define _STD_BEGIN
  #define _STD_END
#endif /* __cplusplus */

 很明顯,Microsoft已經將標準庫封在名稱空間std中了,所以下次我們要使用時一定不要忘記了加上
  using namespace std;
 
  呵呵

二、關於list::list的定義說明幾點(Micrsoft 6.0版本)
對於list的使用大家一定不會陌生,可是一定會對如何實現這些是一些疑惑的,我也是如此。我一直想知道list是如何實現其定義的。好的,首先我們看到MSDN中給出list::list的實現
 list::list
  explicit list(const A& al = A());
  explicit list(size_type n, const T& v = T(), const A& al = A());
  list(const list& x);
  list(const_iterator first, const_iterator last, const A& al = A());
說明list有四種初使化方式,但我對於這四個定義有幾個問題
  1. explicit 是作什麼用的?
  explicit 的中文意義是"外在的" ,其反意詞是 implicit
 
  那麼它有什麼特點,讓我們來看一個例子(MSDN中有)
  class X {
  public:
  explicit X(int);  確
  explicit X(double) {  確
  // ...
  }
  };

  explicit X::X(int) {}  正確
  ...
 
  說明:explicit 僅能用於類定義的內部
 
  還有一個例子(定義為以上正確定義的類)

  void f(X) {} 
  void g(int I) {
  f(i);  // 錯誤
  }
  void h() {
  X x1(1);  // 正確
  }
 
  如果沒有explicit定義,f(i)是可以透過的,因為可以實現一個隱式轉換
  int->(implicit) X  用i來構造一個匿名X類,作為f()的引數。
 
  而由於有了explicit定義,故而此一步無法實現。
  MSDN的原文是: The function call f(i) fails because there is no available implicit conversion from int to X.

  另外:需要注意的是 explict 不參定義多引數構造,否則引起其他建構函式不能隱式轉換。
 
  2.我的第二疑問是explicit list(size_type n, const T& v = T(), const A& al = A());
  中 const T & v= T() 代表什麼?
 
  當我問自已這問題時,我注意到我們宣告一個list變數時可以用
  list ilist1(10) 明內含10個元素,元素值為預設值。
  list ilist2(10,5) 個元素,元素值均為5
 
  兩種方式來定一個初使元素一定的list變數
  注意到 T()
  把 T 用int代替,得到
  const int & v=int();
  哈哈, 原來如此簡單!
 
  3.list(const list& x)的意義
  這是一個典型的複製建構函式。
  因為我們可以用
  list slist;
  ...
  list slist2(slist) slist複製給slist2
  至於為什麼要用複製建構函式,你不會說你不知道吧!
 
 
 
 
 

 

 


 
 

 

 

 

 

 

 

 

     


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991679/,如需轉載,請註明出處,否則將追究法律責任。

相關文章