【C++】命名空间 + 输入输出流

最近在准备考试,就随便写点吧


命名空间

c语言中如果出现

#include <stdio.h>
#include <stdlib.h>

int rand = 0;

int main()
{
    printf("%d", rand);
    
    return 0;
}

则会出现重命名的问题

在这里插入图片描述

运行之后结果如上图

  • 同一作用域中不能出现相同变量

  • 在stdlib.h文件中已经定义了rand变量


C++解决了这个问题

C++关键字

在这里插入图片描述

1. namespace

在C/C++中,函数和类的名称存在于全局作用域中,可能会导致很多冲突。

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字 污染,namespace关键字的出现就是针对这种问题的

  • 在不同的作用域里定义变量相互不影响
  • 类似全局变量和局部变量一样,但优先使用局部变量(局部域中变量)
  • 命名空间必须是定义在全局的

2. 作用域限定符 ::

#include <stdio.h>
#include <stdlib.h>
namespace n1
{
	int rand = 0;

}

int main()
{
    //用n1作用域中的变量
	printf("%d", n1::rand);

	return 0;
}

之前在c语言中,局部变量和全局变量同时存在的时候

如果要使用全局变量

printf("%d", ::rand);
//rand前面空表示用全局变量中的参数

3. 命名空间的使用

  • 不能在命名空间中进行赋值操作
  • 本质是全局变量,放在静态区
  • 初始化在main函数之前

在这里插入图片描述


  • 常用定义,指定隔离
#include <stdio.h>
#include <stdlib.h>

namespace n1
{
	int rand = 0;
    
    int add(int x, int y)
    {
        return x + y;
    }
    
    struct str
    {
        int a;
        struct str* node;
    };
}

int main()
{
    //用n1作用域中的变量
    n1::rand = 2;

    //函数调用
    n1::add(1, 2);

    //结构体
    struct n1::str s;
    s.a = 0;

	return 0;
}

  • 不用作用域限定符,using namesapce
#include <stdio.h>
//#include <stdlib.h>
namespace n1
{
    int rand = 0;
}
using namespace n1;

int main()
{
    rand = 1;
	return 0;
}
  • 全部展开,隔离失效

在这里插入图片描述


  • 展开某一个
#include <stdio.h>
//#include <stdlib.h>
namespace n1
{
    int rand = 0;
    int a = 2;
}
using n1::rand;

int main()
{
    rand = 1;
	return 0;
}

4. 命名空间嵌套使用

#include <stdio.h>
#include <stdlib.h>
namespace n1
{
    int rand = 0;
    namespace n2
    {
        int rand = 2;
    }

}

int main()
{
    //嵌套
    n1::rand = 1;
    n1::n2::rand = 10;

	return 0;
}

5. 命名空间命名重复

  • 不会出现问题,只是在编译的时候合并在一起
#include <stdio.h>
#include <stdlib.h>
namespace n1
{
    int rand = 0;
    namespace n2
    {
        int rand = 2;
    }

}

namespace n1
{
    int b = 0;
}

int main()
{
    //命名重复
    n1::rand = 1;
    n1::b = 4;
	return 0;
}

二、C++输入输出

1. C++库的头文件

类似c语言中的stdio.h

  • C++库的头文件在iostream中(输入输出流)
#include <iostream>
using namespace std;

int main()
{
	int a = 10;

	cout << a << endl;

	return 0;
}
  • 这里的C++库的实现的定义在std这个标准的命名空间中
  • 这样就防止你定义的变量和库里面的变量冲突的问题
  • 但依然存在问题就是在大的工程项目中,如果依然这样使用,可能会造成问题
  • 所以还是建议用局部命名空间或者作用域限定符指向命名空间

2. 输入输出流

  • 使用cout标准输出(控制台)cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。

  • 这两个都可以自动识别类型

  • endl相当于n

#include <iostream>
using namespace std;

int main()
{
	int a = 10;

	cin >> a;
	cout << a << endl;

	return 0;
}

在这里插入图片描述


如果要控制小数点位数,还是建议用printf


本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>