• 【C++·峰顶计划】命名空间与Cin输入Cout输出操作


    Hi!我是Duoni!

    6b3b8b32faf14ba3919e5536c22a5289.jpeg

    目录

    🍑入门仪式

    🍑命名空间

    🍑局部展开

    🍑全局展开

    🍑指定展开

    🍑cin函数与cout函数

    🍑cin输入函数

    🍑cout输出函数

    🍑iostream库声明优化


    🍑入门仪式

    初入C++,对Duoni来说也算是进入到一个新的学习阶段啦!

    同样的,为表虔诚,入门仪式不能丢了!

    1. #include
    2. int main()
    3. {
    4.        std::cout << "Hello C++" << std::endl;
    5.        return 0;
    6. }

    其实仔细一看,除了主函数式一样外,其他的表达式、关键字和头文件都发生了改变,看来接下来是一场“恶战”。不过学C++嘛,还是得笑着学!

    以此为原点,向下刨根问底!


    🍑命名空间

    在这,我想试着打印一个全局变量rand的值,那么程序会成功吗?

    1. #include
    2. int rand = 0;
    3. int main()
    4. {
    5.        printf("%d\n", rand);
    6.        return 0;
    7. }

    显然,结果是不尽人意的。编译器给出了错误警报。

    那么提醒中rand为什么被重定义了?它不是应该是我们创建的一个全局变量吗?

    究其根本:

    printf在执行时,它所用到的参数会默认先在局部域中寻找。如果找不到,那么他便会进入全局域中搜寻。

    结果它好生幸苦的来到全局变量中,却发现了有两个rand变量名:第一个是在头文件中的rand关键字,第二个是全局变量中的rand,两个名字一样,printf函数并不知道该选用谁,于是便发出了:重定义报错。

    ecee29c54a4d422cb10e831e1a398440.png

    这是一个命名错误,那若非要用头文件中的关键字作为变量名该怎么处理捏?

    1. #include
    2. namespace Dt
    3. {
    4.        int rand = 0;
    5. }
    6. int main()
    7. {
    8.        printf("%d\n", rand);
    9.        return 0;
    10. }

    参照报错,那我们就在主函数外再建立一个域,包含着rand,这回应该不能出错叭?

    tips:namespace是指命名空间,可用于定义局部命名。

    e33f4a5fc8c64a6a82e03c35400e6870.png

    d4afb6c959bf4a829a267881b49f77a2.png

    怎么打印显示的是一组长码呢?

    其实,尽管将rand重新存放在一个局域中,但printf还是无法访问到它。

    相反,printf所访问的是头文件中的rand关键字,这一串长码就是其关键字的地址。

    1. #include
    2. namespace Dt
    3. {
    4.        int rand = 0;
    5. }
    6. int main()
    7. {
    8.        printf("%d\n", Dt::rand);
    9.        return 0;
    10. }

    dbf879a3f57349fa9d6ea4144871e304.png

    那么如何让printf去访问局域中的rand呢?

    其实很简单,这里只要在prntf参数前标上空间名就能解决。

    这就好比:购物时要填写自己的收货地址,这样才能将或准确无误的给你送到。


    🍑局部展开

    局部展开:using namespace XXX(局域名)

    1. namespace Dt//创建命名空间
    2. {
    3.        int head = 0;
    4.        int tail = 0;
    5. }
    6. using namespace Dt;//展开局部命名空间
    7. int main()
    8. {
    9.        printf("%d %d\n", head, tail);
    10.        return 0;
    11. }

    意义:这种做法是较好的命名使用习惯。

    在项目中,多多少少会出现命名的争端,用这种局部展开的方式,可以保证即使他人与你命名相撞,也不影响你的程序运转,因为有指定的命名域。


    🍑全局展开

    全局展开:using namespace std:

    标准库命名空间:std(是指标准输入\输出标准库的命名空间)

    意义:全局展开命名空间意味着将库中所有的关键字进行展开,这种做法可能夹杂着危险,也存在着效率上的减弱。


    🍑指定展开

    指定展开:using std(不指定命名空间)::XXX(关键字)

    意义:可展开命名空间中的指定关键字。项目中最常用的方法是:局部展开+指定展开。

    1. using std::cout;
    2. using std::endl;
    3. int main()
    4. {
    5.        cout << "Hello C++" << endl;
    6.        cout << "Hello C++" << endl;
    7.        cout << "Hello C++" << endl;
    8.        cout << "Hello C++" << endl;
    9.        cout << "Hello C++" << endl;
    10.        return 0;
    11. }

    这么一搭配,命名安全性UP!UP!UP!


    🍑cin函数与cout函数

    在C语言中,标准输入与标准输出是:printf与scanf函数。

    C++虽然继承了C的近乎所有特性,但还是对此进行了优化,但具体优化了哪些呢?

    我们移步向后看。


    🍑cin输入函数

    cin标准输入是istream类型的对象,而istream类则含与iostream的标准库中。

    cin的优化:自动辨认数据类型输入

    输入运算符">>":它接收cin的类istream在键盘上所读取到的数据,然后再将数据赋值给变量对象。(只能搭配cin使用)

    1. int main()
    2. {
    3.        int val_i;
    4.        double val_d;
    5.        std::cin >> val_i >> val_d;//输入
    6.        printf("val_i = %d val_d = %lf\n", val_i, val_d);
    7.        return 0;
    8. }

    fcfd477484ab4543910b6372a6c91e92.png

    cin优化了scanf的格式化输入的规则,通过封装实现了数据类型的自动识别。

    这项优化着实让很多伙伴解放了双手!


    🍑cout输出函数

    cout标准输出是ostream类型的对象,而ostream类则含与iostream的标准库中。

    cout的优化:自动识别数据类型输出

    输出运算符"<<":运算符将对象的值写入到ostream类中,也可以理解为直接打印显示。(只能搭配cout使用)

    endl操纵符:endl通常是在一个输出表达式的尾部出现,它的功能体现与'\n'的换行没有差异,都具有结束当前行的功能。

    1. int main()
    2. {
    3.        int val_i;
    4.        double val_d;
    5.        std::cin >> val_i >> val_d;//输入99 3.14
    6.        std::cout << val_i << " " << val_d << std::endl;//打印
    7.        return 0;
    8. }

    4c55aae5ffaa40c5b189ecbdebeef6dd.png

    tips:虽然具有自动识别类型的优化,但个人觉得还是C语言的格式化输入输出比较好用。

               如果说优化后的输入输出流是自动挡,那么老版的格式化输入输出流就是自动挡!

    附:输入输出流待深入后继续更文。


    🍑iostream库声明优化

    早期,因为标准库将所有的功能都集中在全局域中实现,故使用时只需要在声明库的时候加上后缀“.h”即可。

    后期,语言引入了std命名空间概念,以及为了与C语言头文件进行区分,也为了能够正确的使用命名空间,所以C++语法规定头文件后缀不加.h。

    除了一些老编译器外,我们现在几乎看不到C++中带.h的头文件声明了。


    文章到这就结束了!如果喜欢就关注Duoni叭!

  • 相关阅读:
    基于STM32结合CubeMX学习Free-RT-OS的源码之信号量与互斥量
    MyCat的入门介绍
    冠达管理:有色金属迎顺周期行情 板块估值降至历史低位
    基于Spring Boot的ERP仓储管理信息系统设计与实现毕业设计源码150958
    matlab线性规划与整数规划方法
    医院的工作手机、平板等智能终端的安全管理
    Java的JDBC编程
    ubuntu搭建sftp服务
    【nlp】2.5(cpu version) 人名分类器实战项目(对比RNN、LSTM、GRU模型)
    GBase 8c V3.0.0数据类型——HLL函数和操作符(日志函数)
  • 原文地址:https://blog.csdn.net/Duoni_7/article/details/126077259