檔案.cpp,b.cpp,和將所有編譯main.cpp就好了,因為個人沒有問題。然而,當.cpp和b.cpp放在同乙個專案,乙個命名衝突會發生,因為函式是定義在dosomething()。這將導致鏈結器錯誤。
大多數命名衝突發生在兩種情況下:
1)將兩個檔案新增到具有相同名稱(鏈結器錯誤)的函式(或全域性變數)的同乙個專案中。
2)乙個**檔案包含乙個包含乙個與其他東西衝突的識別符號的標頭檔案(編譯錯誤)。我們將在下一節課中討論標頭檔案。
隨著程式變得越來越大,並使用更多的識別符號,被引入的命名衝突的可能性大大增加。好訊息是,c++避免命名衝突提供了大量的機制(如區域性範圍,使變數在函式內部的互相矛盾,和命名空間,我們將介紹不久),所以大部分時間你不需要擔心這個。
std命名空間
當c++最初的設計,所有的c++標準庫中的識別符號(如cin和法院)都可直接使用。然而,這意味著標準庫中的任何識別符號都可能與您為自己的識別符號選擇的名稱衝突。**工作可能會突然有乙個命名衝突的時候你#包含標準庫中的新檔案。或更糟的是,程式將編譯乙個版本的c++下編譯可能不是未來版本的c++下,作為新的功能引入到標準庫可能衝突。所以c++感動所有功能在標準庫為乙個特殊的區域稱為命名空間。
就像乙個城市保證城市內的所有道路都有獨特的名字,乙個命名空間保證命名空間中的識別符號是唯一的。這樣可以防止命名空間中的識別符號與其他識別符號衝突。
原來,std::cout的名字並非「std::cout」。這實際上只是「cout」,和「性病」是命名空間的名字,它生活在。所有的c++標準庫的功能是在命名空間std中定義的命名(簡稱標準)。這樣,我們不必擔心標準庫的功能與我們自己的識別符號的命名衝突。
我們將談論更多的空間在未來教訓,教你如何建立你自己的。現在,你真的需要知道命名空間的唯一的一件事是,當我們使用乙個識別符號(如std::cout),是標準庫的一部分,我們需要告訴編譯器,該識別符號在std命名空間中的生活。
規則:當您在命名空間中使用識別符號時,您必須始終與識別符號一起標識命名空間
顯式命名空間限定性標準::
告訴編譯器cout生活在std命名空間中利用「性病的最直接的途徑::」字首。例如:
一std::cout <<「hello world!」;
這是使用cout的最安全的方式,因為沒有歧義的地方法院的生活(這顯然是在std命名空間中)。
c++提供了其他快捷鍵說明命名空間識別符號的一部分(通過使用語句)。我們在那些課4.3c --使用語句。
很難描述命名空間現在因為我們還沒有覆蓋的一些語言,我真的很需要準確地描述他們的。一種認為他們現在:命名空間將字首變數和型別的名字。這個字首函式非常像你的最後乙個名字在現實生活中-它有助於確保即使你可能有相同的第乙個名字作為別人,你仍然可以唯一地確定通過使用兩個你的名字在一起。這有意義嗎?我談論更多關於4章中的命名空間。
關於你的第二個問題,因為這個語句以分號結束,你可以把另乙個宣告,這個宣告的權利。然而,這通常被認為是壞的形式。每行的乙個語句是推薦的做法,與乙個可選的注釋到右邊(或以上)。
大多數演算法及其推廣
有一種演算法叫大多數演算法,大多數意思是給定乙個陣列,已知裡面有乙個數的統計個數超過了總數的一半。比如1,2,3,1,1,1 那麼1就是大多數。有乙個簡單的演算法就是排序,然後取中位數。時間複雜度為o nlogn 那麼有沒有更快速的演算法呢,這裡介紹一種o n 的演算法。其原理就是開乙個臨時變數,和...
大多數重構可以避免
這篇文章的內容其實是我一直想說的,郭昂寫的即全又現實。領導都怕重構的,其實也沒並要一開始就大刀闊斧的重構,一般來說可以在實現新功能時就一邊重構一邊做新的功能。慢慢的,那些舊的過時的 自然也會被淘汰的。郭昂在前後兩家公司的工作中,主持和經歷十餘次重構,涉及 和架構。在他看來,如果不做重構,任 隨意膨脹...
摩爾投票法和大多數
摩爾投票演算法 假設有這樣乙個場景 票選村長,每人可投一票,我們將候選村長從1開始編號,村民們在票上寫上候選村長的編號即可完成投票。那麼最後統計的票可形成乙個整型陣列。那麼誰是村長呢?票數過半的那個人。摩爾投票演算法可以快速的計算出乙個陣列 現次數過半的數即大多數 majority 演算法核心思想是...