【C++】从认识using namespace std开始进入C++的学习

简介: 【C++】从认识using namespace std开始进入C++的学习

前言

很多人在刚刚开始学习C++的时候,老师一般会让大家直接加上这样一段代码:

using namespace std;

可究竟为什么要加上这段代码??

也许你的老师并没有展开细讲

那么今天,博主就会从这一最初的疑惑开始,与大家一起进入C++的学习。


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.命名空间namespace

学习到现在的阶段,大部分人可能还没有接触甚至没有见过比较大型的项目。

在一些大型项目中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。

通俗的讲,就是重名。

C++之父·本贾尼在设计C++语言时就发现了这一问题,命名空间就是他提出的解决方案。

namespace顾名思义就是命名空间,在C++中namespace是一个关键字,就像整型int,字符型char一样。

也就是说,本贾尼为了避免命名冲突或名字污染等问题,专门写了一个关键字namespace,将变量、函数和类的名称可以放在一个空间里,从而就解决了重名的问题。


🔎那么我们接下来就来看一看命名空间是如何使用的🔍


2.怎样使用命名空间

首先命名空间中可以定义变量/函数/类型,比如

namespace f1
{
  //变量
  int rand = 10;
  //函数
  int Add(int left, int right)
  {
    return left + right;
  }
  //类型
  struct Node
  {
    struct Node* next;
    int val;
  };
}

其次命名空间可以嵌套,比如

namespace f1
{
  int a;
  int b;
  int Add(int left, int right)
  {
    return left + right;
  }
    //嵌套
  namespace f2
  {
    int c;
    int d;
    int Sub(int left, int right)
    {
      return left - right;
    }
  }
}

在同一工程中,如果存在多个相同名称的命名空间,程序在执行时,会将他们合并,比如

// test.h
namespace f1
{
  int Mul(int left, int right)
  {
    return left * right;
  }
}
// test.c
namespace f1
{
  int a;
  int b;
  int Add(int left, int right)
  {
    return left + right;
  }
  namespace f2
  {
    int c;
    int d;
    int Sub(int left, int right)
    {
      return left - right;
    }
  }
}

注意:大家可以将命名空间理解为作用域,一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。


如何使用命名空间中的变量、函数和类型呢


有三种方式可以使用命名空间中的内容:

(1)加命名空间名称作用域限定符::

int main()
{
  printf("%d\n", N::a);
  return 0;
}

(2)使用using将命名空间中某个成员引入

using N::b;
int main()
{
  printf("%d\n", N::a);
  printf("%d\n", b);
  return 0;
}

(3)使用using namespace 命名空间名称 引入

using namespce F;
int main()
{
  printf("%d\n", F::a);
  printf("%d\n", b);
  Add(10, 20);
  return 0;
}

3.using namespace std的作用

了解了上面的内容,using与namespace你就都应该了解了。

现在的问题就剩下std是什么了。

std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。

也就是说,using namespace std就是上面讲解命名空间的使用中的第三个方式罢了。

我们可以理解为展开,将该命名空间展开,使该命名空间中的变量、函数和类型名称暴露出来。

using namespace std的意思就是将C++标准库展开,让我们可以使用里面的各种变量、函数和类型。


4.什么场景下适合展开标准库命名空间

你一定想到了,展开命名空间是一件很不安全的做法,因为本贾尼起初设计命名空间的本意就是为了让命名空间内部的变量、函数和类型名称不冲突或不被污染。

那么如何展开std从而让使用更加合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

🔑🔑🔑那么看到这里,你的疑惑是否被解答了呢🔑🔑🔑

🌝如果有任何问题,欢迎在评论区提出,博主看到一定会认真回复的🌝


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

========================================================================= 

目录
相关文章
|
2月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
56 0
|
17天前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
12 1
|
1月前
|
安全 C++
C++: std::once_flag 和 std::call_once
`std::once_flag` 和 `std::call_once` 是 C++11 引入的同步原语,确保某个函数在多线程环境中仅执行一次。
|
1月前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
3月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
44 6
|
3月前
|
C++ 运维
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
62 2
|
3月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector<std::shared_ptr<int>>;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
62 5
|
3月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
3月前
|
人工智能 分布式计算 Java
【C++入门 一 】学习C++背景、开启C++奇妙之旅
【C++入门 一 】学习C++背景、开启C++奇妙之旅
|
3月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用