C++中using关键字介绍
C++中using 指令(Using Directive)和using 声明(Using Declaration)介绍
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; // 只引入 endl
int 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 指令。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)