BlueDog 關於標準C++有關問題的解答<二> (轉)
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
list
兩種方式來定一個初使元素一定的list變數
注意到 T()
把 T 用int代替,得到
const int & v=int();
哈哈, 原來如此簡單!
3.list(const list& x)的意義
這是一個典型的複製建構函式。
因為我們可以用
list
...
list
至於為什麼要用複製建構函式,你不會說你不知道吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991679/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於 a 標籤跳轉問題
- **【求助】關於抽樣和標準化的問題**
- 關於二維陣列指標的問題陣列指標
- 關於CleanMyMac常見問題與解答Mac
- 關於C++當中的指標懸空問題C++指標
- Mac有防火牆嗎?關於Mac防火牆常見的問題解答Mac防火牆
- 關於.NET微服務最熱門的問題解答微服務
- 有關this指標指向問題指標
- 關於“等保保護”最常見問題解答!
- 有關超聲波感測器的常見問題解答
- 有關於css中行高的問題CSS
- 關於a標籤的字型顏色問題
- 關於 Laravel6.0 開發中的簡單小問題解答Laravel
- 有關模型關聯的問題模型
- 關於C++的標頭檔案C++
- [20211220]關於標量子查詢問題.txt
- fastapi 關於執行緒池、同步、非同步的問題解答彙總ASTAPI執行緒非同步
- 關於租用香港伺服器疑問解答伺服器
- 關於租用香港伺服器疑問解答。伺服器
- 關於租用香港伺服器疑問解答?伺服器
- C++關於DLL中建立套接字的問題(求教)C++
- 關於盒模型相關的問題模型
- 關於this指向的問題
- 有關onethink資料驗證若干問題,希望官方給予解答
- HTTPS總結+相關面試問題解答HTTP面試
- 關於QT的標頭檔案相互包含的問題QT
- 關於Filter中ServletRequest強轉HttpServletRequest問題FilterServletHTTP
- 恆創科技:有關伺服器虛擬化的常見問題解答伺服器
- 量子雜誌:數學家成功解答了關於奇圖的舊問題
- Java中關於二分查詢的問題Java
- 關於C++ 的異常處理,解答在這來看看吧~C++
- 自問自答系列——關於 Laravel6.0 開發中的簡單小問題解答Laravel
- 關於 Puerts 的效能問題
- 關於DrawerLayout的小問題
- 關於javascript的this指向問題JavaScript
- [20180819]關於父子游標問題(11g).txt
- 關於html的a標籤的target="__blank "的安全漏洞問題HTML
- 關於標題彈出指令
- [20191202]關於hugepages相關問題.txt