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;
}

注意⚠️!!!

使用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;
}

九、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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/120012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux开发工具的使用(vim、gcc/g++ 、make/makefile)

文章目录 一 &#xff1a;vim1:vim基本概念2:vim的常用三种模式3:vim三种模式的相互转换4:vim命令模式下的命令集- 移动光标-删除文字-剪切/删除-复制-替换-撤销和恢复-跳转至指定行 5:vim底行模式下的命令集 二:gcc/g1:gcc/g的作用2:gcc/g的语法3:预处理4:编译5:汇编6:链接7:函…

【Sql】sql server数据库提示:执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。

【问题描述】 打开sql server2008r2数据库的时候&#xff0c; 系统提示执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb&#xff0c;错误&#xff1a;926。 【概念理解】 首先MSDB数据库是的作用&#xff1a; 用于给SQL Server代理提供必要的信息来运行调度警…

2 快速上手使用Paimon数据湖

2.1 基于Flink SQL操作Paimon 在这里我们基于Flink 1.15(ON YARN)、Paimon 0.5版本开发一个案例。 注意&#xff1a;想要使用Paimon是非常简单的&#xff0c;不需要复杂的安装部署&#xff0c;只需要使用一个jar包即可对它进行操作。 我们在使用Paimon的时候其实也可以把它简单…

云闪付支付接口的技术实现方式

&#xff08;一&#xff09;整体框架。      云闪付的整体架构如图 1 所示&#xff0c;总体与原有的支付清算体系相同&#xff0c;只是增加了云端支付平台、移动应用平台和移动应用。云端支付平台主要对移动应用端的限制密钥进行更新和管理&#xff0c;同时对云端支付账户进…

2011年408计网

第33题 TCP/IP 参考模型的网络层提供的是&#xff08;&#xff09;A. 无连接不可靠的数据报服务B. 无连接可靠的数据报服务C. 有连接不可靠的虚电路服务D. 有连接可靠的虚电路服务 本题考查TCP/IP 参考模型的网络层 若网络层提供的是虚电路服务&#xff0c;则必须建立网络层的…

WPF中依赖属性及附加属性的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 依赖属性 由依赖属性提供的属性功能 与字段支持的属性不同&#xff0c;依赖属性扩展了属性的功能。 通常&#xff0c;添加的功能表示或支持以下功能之一&#xff1a; 资源数据绑定样式动画元数据重写属性值继承WPF 设计器集成 …

佳能相机拍出来的dat文件怎么修复为正常视频

3-3 佳能相机是普通人用得最多的相机之一&#xff0c;也有一些专业机会用于比较重要的场景&#xff0c;比如婚庆、会议录像、家庭录像使用等。 但作为电子产品&#xff0c;经常会出现一些奇怪的故障&#xff0c;最严重的应该就是拍出来的东西打不开了。 本文案例是佳能相机拍…

校园安防监控系统升级改造方案:如何实现设备利旧上云与AI视频识别感知?

一、背景与需求分析 随着现代安防监控科技的兴起和在各行各业的广泛应用&#xff0c;监控摄像头成为众所周知的产品&#xff0c;也为人类的工作生活提供了很大的便利。由于科技的发达&#xff0c;监控摄像头的升级换代也日益频繁。每年都有不计其数的摄像头被拆掉闲置&#xf…

51单片机-串口通信

文章目录 前言1.基础介绍2.串口实战3.4. 前言 1.基础介绍 常见1&#xff0c;2&#xff0c;3,电源 常用方式1 fosc外部晶振 2.串口实战 3. 4.

软件测试/测试开发丨探索Python的魔力:从第一个程序到快捷键大揭秘

点此获取更多相关资料 第一个 Python 程序 通过程序输出 Hello World 是在学习每一门编程语言时&#xff0c;都会接触到的第一个程序。 在 Python 中&#xff0c;可以通过内置函数 print() 实现向控制台输出 Hello World 。 使用 print()输出 可以进入 命令行交互模式 或使…

从研发域到量产域的自动驾驶工具链探索与实践

导读 本文整理自 2023 年 9 月 5 日百度云智大会 - 智能汽车分论坛&#xff0c;百度智能云自动驾驶云研发高级经理徐鹏的主题演讲《从研发域到量产域的自动驾驶工具链探索与实践》。 全文中部段落附有演讲中 2 个产品演示视频的完整版&#xff0c;精彩不容错过。 (视频观看&…

生态环境领域基于R语言piecewiseSEM结构方程模型

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…

【网络】五中IO模型介绍 + 多路转接中select和poll服务器的简单编写

高级IO 前言正式开始前面的IO函数简单过一遍什么叫做低效的IO钓鱼的例子同步IO和异步IO五种IO模型阻塞IO非阻塞IO信号驱动多路转接异步IO 小结 代码演示非阻塞IO多路转接select介绍简易select服务器timeout 为 nullptrtimeout 为 {0, 0}timeout 为 {5, 0}调用accept select编写…

macos端串口调试推荐 serial直装激活 for mac

serial for mac版软件特色 1.准备好macOS High Sierra 最近的升级是否会让您的设备落后&#xff1f;Serial将使其恢复正常工作&#xff0c;同时保持Mac的安全功能完好无损。 2.完美无瑕的仿真 Serial是一个全功能的终端仿真器&#xff0c;支持Xterm&#xff0c;VT102和ANSI…

pyspark连接mysql数据库报错

使用pyspark连接mysql数据库代码如下 spark_conf SparkConf().setAppName("MyApp").setMaster("local")spark SparkSession.builder.config(confspark_conf).getOrCreate()url "jdbc:mysql://localhost:3306/test?useUnicodetrue&characterE…

Mactracker for mac(硬件信息查询工具)免费下载

想知道你电脑的信息吗&#xff1f;Mactracker Mac版是Macos上一款硬件信息查询工具&#xff0c;可以查询电脑中的硬件信息&#xff0c;还可以查看您使用软件的具体情况&#xff0c;苹果电脑产品和周边产品的信息&#xff0c;售价等等&#xff0c;让您对电脑有更多深刻的了解。 …

NowCoder | 环形链表的约瑟夫问题

NowCoder | 环形链表的约瑟夫问题 OJ链接 思路&#xff1a; 创建带环链表带环链表的删除节点 代码如下&#xff1a; #include<stdlib.h>typedef struct ListNode ListNode; ListNode* ListBuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node…

Zabbix如何监控腾讯云NAT网关

1、NAT网关介绍 NAT 网关&#xff08;NAT Gateway&#xff09;是一种支持 IP 地址转换服务&#xff0c;提供网络地址转换能力&#xff0c;主要包括SNAT&#xff08;Source Network Address Translation&#xff0c;源网络地址转换&#xff09;和DNAT&#xff08;Destination N…

在Python中使用deepfakes实现AI换脸功能

目录 一、Deepfakes技术原理 二、Deepfakes技术实现方法 三、Deepfakes技术应用与实现代码 四、结论 近年来&#xff0c;深度学习技术在图像处理、计算机视觉和人工智能领域取得了显著的进步。其中&#xff0c;Deepfakes技术是一种基于深度学习的图像合成技术&#xff0c;可…

AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀

文章目录 一、ChatGPT简介二、ChatGPT在产品经理工作中的应用1. 快速获取用户反馈2. 智能分析竞品3. 智能推荐产品4.分析市场趋势5.优化产品功能 三、总结与展望《AI时代产品经理升级之道&#xff1a;ChatGPT让产品经理插上翅膀》亮点内容简介目录作者简介获取方式 随着人工智能…