【C++学习手札】-using与namespace详解,基本的输入与输出使用

简介: 【C++学习手札】-using与namespace详解,基本的输入与输出使用

C++的第一个程序

       开始的开始,我们写程序的第一步是啥?

      头文件!

       写C++的第一个程序从头文件开始!

#include <iostream>的解析

       iostream是啥意思呢?来我给你分分! I  O  stream

       啥意思呢?        i-input 输入 o-output输出 stream-流

 这个头文件本质上类似C语言的stdio.h,是输入输出流头文件!

       好,头文件找到了我们开始写第一个程序吧!

第一个程序

#include <iostream>
//std(标准) 使用标准的命名空间
using namespace std;
//有且只有一个主函数 可以有多个其他函数
int main(int argc, char *argv[])
{
//cout 输出 类似 c语言的printf
//endl 类似 c语言的 换行符
// printf("Hello world!\n");
//cout代表的输出设备
cout << "Hello world!" << endl;//将字符串输出到 控制台
//cin代表的是输入设备
int num =0;
cin >> num;//将建键盘输入的数据 赋值给 num
cout<<"num = "<<num<<endl;
return 0;
}

   这时候问题又来了?using namespace std;又是啥?

using namespace std;

       使用using namespace std;是一种简化代码的方式,它可以完全打开std命名空间,使得在代码中可以直接使用std中的函数和对象,而不需要在前面加上命名空间名称和  ::  

       啥意思呢? 请看下面这段代码:

    printf("Hello world!\n");//C语言常用形式
  int num = 0;
  scanf("%d,&num");
  printf("%d\n",num);
//以下为C++中支持的输出输入方式
    using namespace std;
    cout << "Hello world!" << endl;//加入了using namespace std;后
    int num =0;
    cin >> num;
    cout<<"num = "<<num<<endl;
//
  std::cout << "hello world!" << std::endl;//无using namespace std;
  int num = 0;
  std::cin >> num;
  std::cout << num << std::endl;

通过比对,我们很容易就能观察到C++中,加入了using namespace std;后,与没有加入前的区别,加入后就不需要在输入输出以及换行前加入std::了!

       接着我们再来看看其中与C语言相对应的操作!

cin、cout、endl

cin == scanf
cout == printf
endl == '\n' 

注意:endl中的 l 是字母 l 而不是数字 1  !!!


C++对C的扩展

1、::作用域运算符(表明 数据、方法 的归属性问题)

       先看下面这一段代码

using namespace std;
int a = 10;//全局变量
void test1()
{
    int a = 20;//局部变量
    cout<<"局部变量a = "<<a<<endl;//优先选择局部变量
    //::作用域运算符(c++独有)
    cout<<"全局变量a = "<<::a<<endl;//取全局变量
}

输出结果为:


2、命名空间 namespace 解决命名冲突

2.1 namespace命名空间的定义

       看看下面这段代码:

//定义一个名字为A的命名空间(变量、函数)
namespace A {
int a = 100;
}
namespace B {
int a = 200;7 }
void test2()
{
//A::a a是属于A中
cout<<"A中a = "<<A::a<<endl;//100
cout<<"B中a = "<<B::a<<endl;//200
}

    注意:命名空间只能全局范围内定义!!

2.2  命名空间可嵌套命名空间

       栗子:

namespace A 
{
int a = 1000;
namespace B 
{
int a = 2000;
}
}
void test3()
{
cout<<"A中的a = "<<A::a<<endl; //1000
cout<<"B中的a = "<<A::B::a<<endl; //2000
}

2.3 可以随时把新的成员加入已有的命名空间中(常用)

       栗子:

namespace A {
 int a = 100;
 int b = 200;
 }
 //将c添加到已有的命名空间A中
 namespace A {7 int c = 300;
 }
 void test4()
 {
 cout<<"A中a = "<<A::a<<endl;//100
 cout<<"A中c = "<<A::c<<endl;//200
 }

2.4 命名空间 可以存放 变量 和 函数

        栗子:

namespace A {
 int a=100;//变量
void func()//函数
 {
 cout<<"func-a = "<<a<<endl;
 }
 }
 void test5()
 {
 //变量的使用
 cout<<"A中的a = "<<A::a<<endl;
 //函数的使用
 A::func();
 }

2.5 命名空间中的函数 可以在“命名空间”外 定义

      栗子:

namespace A {
 int a=100;//变量
void func();
 }
void A::func()//成员函数 在外部定义的时候 记得加作用域
 {
 //访问命名空间的数据不用加作用域
 cout<<"func-a = "<<a<<endl;
 }
 void funb()//普通函数
 {
 cout<<"funb-a = "<<A::a<<endl;
 }
 void test6()
 {
 A::func();
 funb();
 }

对于namespace的拓展

      1、无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识
符加上了static,使得其可以作为内部连接。

       2、可以对命名空间取个别名

        栗子:

namespace A
{
    int a=10;
}
void text7()
{
    namespace B = A;
}

3、using使用命名空间

3.1 简化从命名空间的成员访问

       栗子:

namespace AB {
 int a=100;
 void func(){cout<<"hello world!"<<endl;}
 }
 void test8()
 {
//使用AB命名空间
 using namespace AB;
//出现的变量 从AB命名空间中找 找不到 从其他地方中
 cout<<"a = "<<a<<endl;
 func();
 }

3.2 using 使用整个命名空间

       看了上面这个例子,我们不妨思考一下,如果我在定义了一个相同名字的局部变量或者全局变量(此直接使用报错)呢?客官别急,且听我为你 一 一 讲解💪

       栗子:

       局部变量:

namespace AB {
  int a = 100;
  void func() { cout << "hello world!" << endl; }
}
void test8()
{
  int a = 200;
  //使用AB命名空间
  using namespace AB;
  //出现的变量 从AB命名空间中找 找不到 从其他地方中
  cout << "a = " << a << endl;//访问的是局部变量中的a
  cout << "a = " << AB::a << endl;//访问的是AB的a
  func();
}

        全局变量:

       话不多说!直接上图!

        这里为VS2022下的报错,可见这样定义是不能用的!但是如果我硬是要这么用呢?看下一点,这时需要指定命名空间中的成员,这样才不会与全局变量冲突!

 

3.3 using 指明使用具体的命名空间成员

       这里先了解两条规则:        

       1、using直接使用 命名空间中的成员 不会和 全局变量冲突。

       2、using直接使用 命名空间中的成员 会和 局部变量冲突。

       栗子:

全局变量

namespace AB {
   int a = 100;
   void func() { cout << "hello world!" << endl; }
}
 int a = 200;
 void test8()
 {
   //using直接使用 命名空间中的成员 不会和 全局变量冲突
     using AB::a;
     cout << "命名空间中a = " << a << endl;//命名空间中的成员 100
   cout << "全局变量中a = " << ::a << endl;//200
     //但是func使用的时候 必须加作用域
     AB::func();
   }
int main()
{
  test8();
  return 0;
}

局部变量

       报错啦!!!

3.4 using声明碰到函数重载

namespace A {
   //函数重载 函数名+参数 组合代表是函数的入口地址
   void func() { cout << " 无参的func" << endl; }
   void func(int a) { cout << " int的func" << endl; }
   void func(int a, int b) { cout << " int int的func" << endl; }
}
 void test9()
 {
   //using指明 使用 A中的func 会对 所有的func起作用
   using A::func;
   func();
   func(10);
   func(10, 20);
 }


总结

       不知道各位读者在看完本文后是否跟作者与相同的疑惑,using namespace std;跟using和namespace是不是有啥关联呢?👀

       这里说明一下main中的std:

       1、使用标准的命名空间std。
       2、std中所有成员名 可以直接使用。
       3、cout endl cin都是命名空间std的成员。

简单的来说就是这个std其实跟我们上面用using、namespace的原理是相同的!

 以下是详细的介绍:


using namespace std;是C++中的一个命名空间的声明语句,它的作用是引入标准命名空间std中的所有成员,使得在代码中可以直接使用std命名空间中的函数、类、对象等,而不需要使用std::前缀。


using声明是C++中的一个语法结构,它可以用来引入命名空间中的特定成员。例如,可以使用using std::cout;来引入std命名空间中的cout对象,之后就可以直接使用cout,而不需要使用std::cout。


namespace是C++中的一个关键字,用于定义命名空间。命名空间可以看作是一个容器,用于将全局作用域中的标识符(如变量、函数、类等)进行分组,以避免命名冲突。例如,std命名空间中包含了许多标准库的函数和类。


因此,using namespace std;语句的作用就是引入std命名空间中的所有成员,使得在代码中可以直接使用std命名空间中的函数、类、对象等,而不需要使用std::前缀。

感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!

                                                              给个三连再走嘛~


相关文章
|
1天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
12 4
2023/11/10学习记录-C/C++对称分组加密DES
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
89 0
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
27 1
|
3月前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
5月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
87 5
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5月前
|
人工智能 分布式计算 Java
【C++入门 一 】学习C++背景、开启C++奇妙之旅
【C++入门 一 】学习C++背景、开启C++奇妙之旅
|
5月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
5月前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开