目录
命名空间
一、为什么使用命名空间
名称空间(namespace)被设计来克服这个困难,并被用作额外的信息来区分类似的函数、类、变量等等,它们在不同的库中具有相同的名称。使用名称空间,您可以定义定义名称的上下文。本质上,名称空间定义了一个范围。
二、命名空间的定义
在C语言中只有一个全局作用域:
1.C语言中所有的全局标识符共享一个作用域
2.标识符之间可能发生冲突
C++中提出了命名空间的概念:
1.命名空间将全局作用域分成不同的部分,
2.不同命名空间中的标识符可以同名而不会发生冲突
3.命名空间可以发生嵌套
4.全局作用域也叫默认命名空间
语法:
namespace Name
{
namespace Internal
{
/*...*/
}
/*...*/
}
C++命名空间的使用:
使用整个命名空间:using namespace name; |
使用命名空间中的变量:using name::variable |
使用默认命名空间中的变量: ::variable |
#include <stdio.h>
#include <iostream>
namespace First
{
int i = 0;
}
namespace Second
{
int i = 1;
namespace Internal //嵌套命名空间
{
struct P //嵌套命名空间
{
int x;
int y;
};
}
}
int main()
{
using namespace First; //使用整个命名空间
using Second::Internal::P; //使用嵌套的命名空间
printf("First::i = %d\n", i);
printf("Second::i = %d\n", Second::i); //使用命名空间中的变量
P p = { 2, 3 };
printf("p.x = %d\n", p.x);
printf("p.y = %d\n", p.y);
system("pause");
return 0;
}
为了防止名字冲突而引入的一种机制,一个项目中可以有多个命名空间,每个命名空间都哟自己的名字,不可以同名。
代码示例:
pro1.h:
namespace pro1 { //在这里声明这个命名空间,并且在里面声明一些函数
void test1();
void test2();
void test3();
}
pro1.cpp:
#include<cstdio>
namespace pro1 { //在这里定义pro1.h中命名空间pro1中声明的test3函数
void test3() {
printf("我是test3\n");
}
}
pro2.cpp:
#include"pro1.h"
#include<iostream>
using namespace std;
namespace pro1 { //在这里为命名空间添加一个test4函数
void test4() {
printf("我是test4\n");
}
}
int main()
{
pro1::test1();
pro1::test2();
pro1::test3();
pro1::test4();
return 0;
}
- 命名空间可以是不连续的,可以写在一个项目中的多个文件中
- 命名空间一般在.h文件中声明一些函数然后在.cpp文件中定义这些函数
- 使用命名空间有两种方法,第一种是使用域运算符 :: ,第二种是使用 using namespace 命名空间,当两个命名空间中有相同的函数,则必须使用第一种调用方法
std::endl作用:
1) 输出换行符 \n
2) 强制刷新 输出缓冲区,缓冲区所有数据都被系统清除了
输出缓冲区:一段内存,cout输出的时候实际是往输出缓冲区输出内容,那么输出缓冲区什么时候把内容输出到屏幕去的 呢?
a)缓冲区满了。
b)程序执行到main函数return语句了。
c)调用了std::endl了, 能够强制刷新输出缓冲区(把缓冲区的内容往屏幕上出输出)。
d)当系统不太繁忙的时候,发现新内容也会正常输出到屏幕(这也就是为什么只用\n也可以起到刷新内容到屏幕的原因)
https://www.cnblogs.com/aquester/p/11850495.html深度
标准输入cin
std::cin 是一个标准输入,与之配合的是输入运算符>>,每次执行完<<后就会返回这个标准输入,所以我们一次可以输入多次内容
标准输出cout
int i = 3 ;
std::cout << i-- << i--; //2,3 vs2012中 从右往左算 而vs2017为 3,2
//不同的编译器 有不同的结果 不应写这种很暧昧的代码
//要避免 在一个表达式中多次的(超过一次的)改变一个变量的值
//如果要多次改变
i--;
std::cout << i;
i--;
std::cout << i;
//这样就很明确。
注释:
1.<< , >> 两个运算符都是overload运算符,所以可以处理不同类型的输入值。
2.std::cout是一个template函数 相当于一个函数指针。