C++是一种面向对象的计算机程序设计语言,?它扩展了C语言的功能,?并引入了面向对象编程的概念,?如类、?继承和多态等,C++是以C语言为基础进行了拓展与创新,C++兼容C语言绝大多数的语法。
还记得我们在学C语言时的第一个代码程序吗?
#include
#include c语言项目类似下面程序这样的命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。 #include 这里我们可以看到编译器报错了,因为在stdlib头文件中包含一个名为rand的函数与定义的变量rand发生了命名冲突。在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。 ?定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接对{}即可,{}中即为命名空间的成员,命名空间中可以定义变量/函数/类型等。 ?namespace本质是定义出个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了。 #include ?namespace只能定义在全局,当然他还可以嵌套定义。 namespaceotto{namespacekun{intrand=1;intAdd(intleft,intright){returnleft+right;}}}intmain(){printf("%d\n",otto::kun::rand);printf("%d\n",otto::kun::Add(1,2));return0;}?项目工程中多文件中定义的同名namespace会认为是个namespace,不会冲突。 ?C++标准库都放在个叫std(standard)的命名空间中。 namespaceN{inta=0;intb=1;}intmain(){printf("%d\n",a);return0;} 所以我们要使用命名空间中定义的变量/函数,有三种方式: ?指定命名空间访问,项目中推荐这种方式。 intmain(){printf("%d\n",N::a);return0;}通过“命名空间+::”的方式在指定命名空间访问。 ?using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。 usingN::b;intmain(){printf("%d\n",N::a);printf("%d\n",b);return0;}展开后使用这个变量时就不用带命名空间了。 ?展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。 usingnamespceN;intmain(){printf("%d\n",a);printf("%d\n",b);return0;} ? ?std::cin是istream类的对象,它主要面向窄字符的标准输入流。 ?std::cout是ostream类的对象,它主要向窄字符的标准输出流。 ?std::endl是个函数,流插入输出时,相当于插入个换行字符加刷新缓冲区。 ?<<是流插入运算符,>>是流提取运算符。 ?使C++输输出更方便,不需要像printf/scanf输输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型,其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。 ?IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识下C++IO流的用法,后面会有专门的个章节来细节IO流库。 ?cout/cin/endl等都属于C++标准库,C++标准库都放在个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。 ?般日常练习中我们可以usingnamespacestd,实际项目开发中不建议使用 ?这里我们没有包含,也可以使用printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错。 #include