目录1. C前言介绍1.1什么是C1.2C的发展历史2.命名空间2.1关于命名空间namespace2.2命名空间的使用2.3嵌套命名空间3.C输入输出1. C前言介绍1.1什么是CC是一门通用、高性能、跨平台的面向对象编程语言由丹麦计算机科学家本贾尼・斯特劳斯特鲁普Bjarne Stroustrup在 1979 年左右基于 C 语言扩展开发而来。简单来说C C 语言 面向对象 现代编程特性它既保留了 C 语言操作硬件、极致高效的优点又增加了更适合开发大型软件的高级功能。1.2C的发展历史C还在不断的向后发展。但是现在社会上主流使用还是C98和C11所有重点要把C98和C11 掌握好随着对C理解不断加深有时间可以去琢磨下更新的特性。2.命名空间2.1关于命名空间namespace在C/C中变量、函数和后⾯要学到的类都是⼤量存在的这些变量、函数和类的名称将都存在于全局作⽤域中可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的在C/C中变量、函数和后⾯要学到的类都是⼤量存在的这些变量、函数和类的名称将都存在于全局作⽤域中可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化以避免命名 冲突或名字污染namespace关键字的出现就是针对这种问题的-----命名空间就是为了防止「名字冲突」让代码更安全、更清晰例如你想创建一个rand的全局变量但与所用库里面的冲突了这时候就会报错注编译查找⼀个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间⾥⾯去查找#include stdio.h #include stdlib.h int rand 10; int main() { // 编译报错error C2365: “rand”: 重定义以前的定义是“函数” printf(%d\n, rand); return 0; }接下来我们就可以创建一个自己的命名空间#includestdlib.h #includestdio.h //namespace本质是定义出⼀个域这个域跟全局域各⾃独⽴不同的域可以定义同名变量所以下 //⾯的rand不在冲突了 namespace qt//命名空间的名字 { //定义变量 int rand10; //这样就不会报错了 //定义函数 int Addint a,int b { return ab; } //定义类型 struct node { struct node*next; int val; }; //嵌套命名空间 namespace sub { int c; int d; int Sub(int a, int b) { return a - b; } } int main() { // 这⾥默认是访问的是全局的rand函数指针 printf(%p\n, rand); // 这⾥指定bit命名空间中的rand printf(%d\n, bit::rand); return 0; }上面的代码定义了一个名为qt的命名空间该命名空间包含有变量、函数、类型、命名空间。和其他名字一样命名空间的名字也必须在定义它的作用域内保持唯一如果在同一个作用域中出现多个相同名字的命名空间编译器最后会把他们合并这意味着命名空间可以是不连续的。命名空间既可以定义在全局作用域内也可以定义在其他命名空间中但是不能定义在函数或类的内部。、2.2命名空间的使用每个命名空间都是一个作用域编译查找⼀个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间⾥⾯去查找。命名空间中的每个名字都必须表示该命名空间内的唯一实体。因为不同命名空间的作用域不同所以在不同命名空间内可以有相同名字的成员。定义在某个命名空间中的名字可以被该命名空间内的其他成员直接访问也可以被这些成员内嵌作用域中的任何单位访问。位于该命名空间之外的代码则必须通过域作用限定符::明确指出所用的名字属于哪个命名空间namespace qt { int a 10; int b 20; } int a 30;//全局 int main() { int a 20;//局部 printf(%d\n, a); printf(%d\n, ::a); // ::前面什么都不写代表全局域 printf(%d\n, qt::a); //qt的命名空间 return 0; }接下来是命名空间的三种使用方法1.命名空间名称及作用域限定符int main() { printf(%d\n, qt::a); return 0; }2.使用using将命名空间中某个成员展开using qt::a; int main() { int a10; printf(%d\n, qt::a); printf(%d\n, a); return 0; }3.展开命名空间的所有成员using namespce qt;//展开 int a100; int main() { printf(%d\n, a);//这里会报错 printf(%d\n, qt::a);//要明确出自哪里 printf(%d\n, b); return 0; }using namespace qt这是将整个命名空间展开将使得所有作用域都可以访问qt当命名空间被展开很可能会跟其他定义的名字成员产生冲突。但是这种冲突是被允许的但必须明确指出名字的命名空间2.3嵌套命名空间嵌套的命名空间同时是一个嵌套的作用域它嵌套在外层命名空间的作用域中。嵌套的命名空间中的名字遵循的规则与往常类似内层命名空间声明的名字将隐藏外层命名空间声明的 同名成员。在嵌套的命名空间中定义的名字只在内层命名空间中有效外层命名空间的代码想要访问它必须在名字前添加限定符。namespace qt { int a 10; namespace qt1 { int a 10;//将外层作用域的a隐藏了 int b 20; } int c qt1::b;//正确访问的是qt1里面的d namespace qt2 { int q qt1::d;//正确 } } int main() { printf(%d\n, qt::qt2::q); printf(%d\n, qt::qt1::a); printf(%d\n, qt::a); return 0; }3.C输入输出#includeiostream using namespace std; // std是C标准库的命名空间名C将标准库的定义实现都放到这个命名空间中 int main() { cout Hello C endl; return 0; }关于iostream是c的头文件新编译器不.h(有点旧编译器还支持iostream.h格式)cout标准输出对象控制台endl输出换行符 刷新缓冲区专门用在cout输出语句里。cin标准输入对象键盘它们都要包含头文件及按照命名空间的使用方法去使用std是流插入运算符是流提取运算符。使用C的输入输出更加方便不需要像printf和scanf输入输出那样需要手动控制格式。C的输入输出可以自动识别变量类型本质上是运算符重载但cout和cin的效率比较低。