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 指令。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐