2010-02-17 55 views
22

如果你去的這個postC++:什麼是:: for?

接受的答案可能有人請解釋爲何他用:

double temp = ::atof(num.c_str()); 

,而不是簡單

double temp = atof(num.c_str()); 

此外,有認爲是一個很好的做法在使用「純」全局函數時使用該語法?

+0

另外,你如何創建一個stackoverflow鏈接,使得當有人點擊它,它直接回答(而不是在頁面的開始)? – sivabudh 2010-02-17 17:05:53

+4

關於直接回答鏈接,請查看「鏈接」鏈接答案底部的左下角。 – 2010-02-17 17:07:33

+2

像這樣:http://stackoverflow.com/questions/1012571/stdstring-to-float-or-double/1012604#1012604 – 2010-02-17 17:07:35

回答

32

它說使用全局版本,而不是在本地範圍內聲明的一個。所以如果有人在你的課堂上宣稱atof,這個肯定會用到全球的。

看一看Wikipedia on this subject

#include <iostream> 

using namespace std; 

int n = 12; // A global variable 

int main() { 
    int n = 13; // A local variable 
    cout << ::n << endl; // Print the global variable: 12 
    cout << n << endl; // Print the local variable: 13 
} 
18

::是範圍解析操作。它在這種情況下作爲一元運算符使用,is to ensure that the name (atof) is always looked up in the global scope - 這可以用於防止名稱隱藏干擾查找。

+0

這很有趣,微軟和維基百科的例子幾乎是相同的 - 我不知道哪些是複製的? – Skilldrick 2010-02-17 17:17:14

+2

最有趣的是,這應該是C++的'std :: atof()';) – 2010-02-17 18:04:32

1

::func()表示此功能不隸屬於任何特定的類。當存在許多具有相同名稱的函數時使用它,並避免在想要的函數與函數名稱前的特定成員函數之間發生混淆。


從C++入門,第4版,第17.2.1節:

「在全球範圍內定義的名字 - 以外的任何類,函數聲明的名稱或命名空間 - 在全局命名空間中定義的全局。名稱空間是隱式聲明的,並存在於每個程序中,每個定義全局範圍實體的文件都將這些名稱添加到全局名稱空間中

範圍運算符可用於引用全局名稱空間的成員。隱含的,它沒有名稱;記號

::member_name 

引用全局命名空間的成員。「

1

假設你有一個函數f()的兩個版本,一個在名稱空間之外定義,另一個在裏面定義。現在讓我們假設你在同一個命名空間中還有一個功能g()。現在,如果你在g()內部執行f(),它將調用在同一個命名空間中定義的那個。但是,如果你想打電話給你的全球版本,你需要做::f()

2

::運算符是範圍解析運算符。

當與類說明符一起使用時,它類似於A :: a,它訪問類A的數據記憶器a。當使用沒有任何說明符的數據記憶器時,它訪問全局變量。

它主要用於以下比賽。

  1. 引用全局變量。
  2. 要引用類的靜態成員
  3. 爲了避免模糊,當一個類繼承多個[非虛擬 基]類。
  4. 使用指令時,在派生類中使用基類函數時,基類中的名稱與派生類的名稱相同,但用於不同類型。當你有一個用相同簽名定義的函數時,如在double temp = :: atof(num.c_str())中那樣訪問全局範圍中定義的函數。
  5. 創建嵌套類的對象。