C++中using關鍵字介紹
C++中using關鍵字有兩種用法,using 指令(Using Directive)和using 聲明(Using Declaration)
using 指令影響整個命名空間,using 聲明只影響特定名稱。
using 指令
定義:using 指令(Using Directive)用于引入整個命名空間。
語法:
using namespace 命名空間名;
這會將整個命名空間引入當前作用域,使得該命名空間中的所有名稱都可以直接使用。
例子:
using namespace std;
// 現在可以直接使用cout、endl等std命名空間中的所有名稱
cout << "Hello" << endl;
其中,namespace是 C++ 關鍵字,表示接下來的是一個命名空間名。std是標準庫的命名空間名,是在 C++98 標準中引入的,它包含了 C++ 標準庫中的所有組件。這條語句是一個 using 指令(Using Directive),它將 std 命名空間中的所有名稱引入到當前作用域。std 是 C++ 標準庫使用的命名空間。它包含了諸如 cout, cin, vector, string 等常用的類、函數和對象。使得 std 命名空間中的所有名稱在當前作用域中可用,無需使用 std:: 前綴。例如,可以直接使用 cout 而不是 std::cout。
“using namespace std;”的替代方案:
使用特定的 using 聲明(后面將解釋“using 聲明”),如:
using std::cout;? // 只引入 cout
using std::endl;? // 只引入 endl
cout << "Hello, World!" << endl;? // 現在可以直接使用 cout 和 endl,無需 std:: 前綴
直接使用完全限定名稱,每次使用標準庫或 其他命名空間中的東西時,都明確指出它來自哪個命名空間。如:
std::cout << "Hello, World!" << std::endl;? // 每次使用 cout 和 endl 時都加上 std::
下面給出一個使用using指令的簡單而完整的示例,以使用using namespace std;為例。
使用 “using namespace std;”源碼為:
#include <iostream>
using namespace std; // 使用using指令“using namespace std; ”int main() {cout << "Hello, World!" << endl; // 現在可以直接使用 cout 和 endl,無需 std:: 前綴return 0;
}
若不使用 “using namespace std;”源碼為:
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl; // 現在使用 cout 和 endl需要 std:: 前綴return 0;
}
順便提示,std是 C++ 標準庫的主要命名空間。但除了 std,C++ 還有一些其他的標準命名空間和常見的非標準命名空間。例如:
std::chrono: 用于時間相關的功能,是std的子命名空間。
std::filesystem (C++17起): 用于文件系統操作。
等等
許多庫和框架都定義了自己的命名空間。
自定義命名空間: 開發者可以創建自己的命名空間來組織代碼,如:
namespace myproject {
??? // 你的代碼
}
命名空間的定義使用關鍵字 namespace,后跟命名空間的名稱,可參見C++ 命名空間簡介https://blog.csdn.net/cnds123/article/details/117959454
還可以可以為長命名空間創建別名。
using 聲明
定義:using 聲明(Using Declaration)用于引入特定的名稱(如函數、類型或變量)到當前作用域。
語法:
using 命名空間名:: 特定名稱;
這只引入特定的名稱到當前作用域,而不是整個命名空間,特定名稱即你想要用的命名空間中的一個標識符。
例子:
using std::cout;
using std::endl;
// 只有cout和endl可以直接使用,其他std名稱仍需完全限定
cout << "Hello" << endl;
下面給出一個使用using 聲明的簡單而完整的示例:
#include <iostream>using std::cout; // 只引入 cout
using std::endl; // 只引入 endlint main() {cout << "Hello, World!" << endl; // 現在可以直接使用 cout 和 endl,無需 std:: 前綴return 0;
}
完全限定名稱
語法:
命名空間名::特定名稱
完全限定名稱是指包含了所有嵌套命名空間的完整名稱,特定名稱即你想要用的命名空間中的一個標識符。例如:
std::cout << "Hello, World!" << std::endl;
這里,std::cout和std::endl就是完全限定名稱。它們明確指出這些名稱來自std命名空間。
完全限定名稱的優點是明確和不易混淆,但可能導致代碼冗長。using聲明則可以簡化代碼,但過度使用可能導致名稱沖突。
在實際編程中,通常會根據具體情況選擇使用完全限定名稱還是using聲明,以平衡代碼的清晰度和簡潔性。
下面給出一個使用完全限定名稱的簡單而完整的示例:
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl; // 每次使用 cout 和 endl 時都加上 std::return 0;
}
using 指令(Using Directive)和using 聲明(Using Declaration)區別
using 指令(Using Directive)
優點:
??? 使用方便,可以快速訪問整個命名空間的所有成員。
??? 在編寫小型程序或快速原型時可以減少輸入。
缺點:
??? 可能導致名稱沖突,特別是在大型項目中。
??? 降低代碼的可讀性,因為不清楚某個名稱來自哪個命名空間。
??? 可能引入不必要的名稱到當前作用域,增加編譯時間。
using 聲明(Using Declaration)
優點:
??? 更精確,只引入需要的特定名稱,減少名稱沖突的風險。
??? 提高代碼可讀性,因為明確了使用的具體名稱。
??? 不會引入不必要的名稱,可能略微提高編譯速度。
缺點:
??? 對于頻繁使用的名稱,可能需要多次 using 聲明。
??? 在某些情況下可能顯得較為繁瑣。
總的來說,using 聲明通常被認為是更好的實踐,特別是在大型項目中。它提供了更好的控制和清晰度。然而,在一些簡單的情況下,using 指令可能更為方便。
using 指令、using 聲明放置位置
一般來而言:
??? 避免在全局作用域使用 using namespace std;,特別是在頭文件中。
??? 優先在最小必要的作用域內使用 using 聲明或指令。
??? 在函數或塊作用域內使用 using 是最安全的做法。
? ? 盡量使用特定的 using 聲明,而不是使用 using 指令。