C++入门学习(1)命名空间和输入输出

简介: C++入门学习(1)命名空间和输入输出

前言


  在C语言和基本的数据结构学习之后,我们终于迎来了期待已久的C++啦!C++发明出来的意义就是填补一些C语言的不足,让我们更加方便的写代码,所以今天我们就来讲一下C语言不足的地方和在C++中的解决办法!


一、命名空间

  在学习命名空间这个概念之前,我们先来看下面这段代码:


在这段代码中,我们定义了一个rand变量,但是我们还知道,rand又是stdlib这个头文件里面的函数名,理应来说应该会命名冲突的,但是我们不要忘了,这里的变量rand是局部变量,当命名冲突的时候,会优先调用局部变量,所以下面程序会正常打印4

    那什么情况下会命名冲突呢?我们接着往下看!

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int rand = 4;
    printf("%d\n",rand);
    return 0;
}


看这段代码,当我们把rand定义成全局变量的时候就会产生命名冲突了,这个程序无法正常执行下去了,那就会有小面包们问(作者喜欢叫读者为小面包),我们难道不可以自己来避免这个命名冲突的问题吗?就不用函数名就得了!可是大家想想,库里面很多函数,我们无法保证在未来写代码的时候,定义的变量名一定不跟函数名冲突,所以这个时候我们的命名空间这个概念就诞生了,那就让我们开始学习C++的第一课----命名空间吧!

#include <stdio.h>
#include <stdlib.h
int rand = 4;
int main()
{
    printf("%d\n",rand);
    return 0;
}


二、命名空间的概念


我们的命名空间,其实就是给我们定义的变量围上一堵墙,我们需要用的时候,就可以去调用这个命名空间,这跟我们C语言的结构体类似,就是把这些变量划分到命名空间里了,防止跟外面的产生命名冲突。也像给变量贴上个标签,告诉程序,这个是我的,不是函数名!


三、命名空间的定义


我们还需要知道在C++里面是可以写C的程序的,来一起看下面这段代码,命名空间的关键字就是namespace,后面再加上命名空间的名字,就是起个名字,随便起,推荐大家起名字的缩写,表明这里面的变量都是自己的,那我们定义完命名空间之后该如何调用呢?

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{
    int rand = 3;
}
int main()
{
    printf("%d\n",xmb::rand);
    return 0;
}

四、 命名空间的内容

命名空间里面可以放变量和函数体,结构体,联合体等数据类型,使用的时候就用上面的调用规则就可以了!


#include <iostream>
namespace xmb
{
    int rand = 12;
    int Add(int x, int y)
    {
        return x + y;
    }
    struct List
    {
        int a;
        int b;
        char c;
    };
    union room
    {
        int a;
        int b;
        char c;
    };
}
int main()
{
    xmb::rand = 3;
    int num = xmb::Add(3,5);
    struct xmb::List la = {1,2,'a'};
    la.b = 3;
    la.c = 4;
    la.c = 'b';
    union xmb::room uroom = {3};
    uroom.a = 4;
    uroom.b = 3;
    uroom.c = 'a';
    return 0;
}

五、命名空间的嵌套

我们的命名空间是可以嵌套的,我们可以嵌套多个命名空间,在调用的时候就依次来就可以。

namespace xmb
{
    int rand = 12;
    namespace xmb1
    {
        int Add(int x, int y)
        {
            return x + y;
        }
        namespace xmb11
        {
            int num = 10;
        }
    }
    namespace xmb2
    {
        struct List
        {
            int a;
            int b;
            char c;
        };
    }
    namespace xmb3
    {
        union room
        {
            int a;
            int b;
            char c;
        };
    }
}
int main()
{
    xmb::xmb1::xmb11::num = 20;
    return 0;
}

六、命名空间在多文件中的应用

既然命名空间如此的好用,那它在多文件中是否可以应用呢?

答案是可以的,但是也有限制规则

头文件:

#include <iostream>
namespace xmb
{
    typedef struct List
    {
        int* data;
        int size;
        int capacity;
    }SL;
    void SLInit(SL* phead);
    void SLPush(SL* phead,int num);
}


函数体:

#include "test.h"
namespace xmb
{
    void SLInit(SL* phead)
    {
        phead->data = nullptr;
        phead->size = 0;
        phead->capacity = 0;
    }
    void SLPush(SL* phead,int num )
    {
        //
    }
}


我们在多文件的时候,命名空间一定要保持一致,

同一个程序中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

比如上面的test.h和上面test.cpp中两个xmb会被合并成一个。


七、命名空间的调用方式

1. 命名空间名称 ➕ :: ➕ 变量名


如图,我们需要调用rand这个变量,只需要如下的调用我们就可以使用了!再也不用担心会命名冲突了!


注意!!!⚠️

只要是跟库里面的函数名冲突了,就用这种方法,其他两种解决不了!

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{
    int rand = 3;
}
int main()
{
    printf("%d\n",xmb::rand);
    return 0;
}

2. using➕命名空间名称➕::➕变量名

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{
    int a = 3;
    int b = 6;
}
using xmb::a;
int main()
{
    printf("%d\n",a);
    printf("%d\n",xmb::b);
    return 0;
}

3. using namespace ➕ 命名空间名称

这个主要就是引入了命名空间,写完这个就可以直接调用命名空间里面的内容

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{
    int a = 3;
    int b = 6;
}
using namespace xmb;
int main()
{
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}

八、C++中的输入输出


大家在学习完命名空间之后,肯定会想,C++的输入输出还是跟C语言的一样吗?还是有自己更好的输入输出语句?


答案是有更好的!接下来我们就介绍C++的输入输出!


1. cout :类似C语言中的printf函数,是标准的输出到控制台/终端上,


2. cin :类似C语言中的scanf函数,是标准的输入,从键盘上输入到变量。


3. << :流插入运算符,配合cout使用


4. >> :流提取运算符,配合cin使用


5. endl :特殊的C++符号,表示换行输出


我们的cout,cin和endl都在std这个命名空间里,而std命名空间在<iostream>这个头文件里,所以我们要使用的时候必须同时调用std和<iostream>它们两个。

8.1 cout的使用

这里就代表从右往左依次流入到cout(控制台/终端)上,先输出hello world 再输出换行

#include <iostream>
using namespace std;
int main()
{
    cout << "hello world" << endl;
    return 0;
}


8.2 cin的使用

cin这里就是从左往右依次输入,输入第一个值给a,空格或者换行,输入第二个值给b

#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    int b = 0;
    cin >> a >> b;
    cout<< a << endl << b << endl;
    return 0;
}


4e275394ed254874a0852adaf96804ab.png

注意⚠️!!!

使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。

C++的输入输出可以自动识别变量类型

#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    double b = 0;
    char c = 0;
    cin >> a >> b >> c;
    cout<< a << endl << b << endl << c << endl;
    return 0;
}


33d344b84d0345ab9bb2ba59e885fac0.png

九、std命名空间的使用惯例

std是C++标准库的命名空间,如何展开std使用更合理呢?

1. 在日常练习中,建议直接using namespace std即可,这样就很方便。

#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    double b = 0;
    char c = 0;
    cin >> a >> b >> c;
    cout<< a << endl << b << endl << c << endl;
    return 0;
}


2.但是 using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。


该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。


所以我们不要展开全部,仅仅引用cou,cin和endl就可以了!

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
    int a = 0;
    double b = 0;
    char c = 0;
    cin >> a >> b >> c;
    cout<< a << endl << b << endl << c << endl;
    return 0;
}
相关文章
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
40 2
C++入门12——详解多态1
|
2月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
81 1
|
2月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
2月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
28 0
|
2月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
2月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
2月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
32 0
|
2月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
33 0
|
6天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
21 2