目录
[2.1 namespace的价值](#2.1 namespace的价值)
一、前言
点来不及悼念C语言,接下来出场的是新的语言C++。不同于C语言的是,C++中增加了许多新的知识例如继承和对象并且支持面向对象编程。本人也是初学C++,如果有什么讲错的地方,还望大家嘴下留情。并欢迎大佬们的指点。
二、正文
如同初学C语言一样,我们的第一个程序你还记得吗?没错就是我们的老盆友"Hello World"
同样在学习C++的时候,我们同样写出我们第一个C++程序。
1C语言第一个程序:
cpp#include<stdio.h> int main() { printf("Hello World\n"); return 0; }
1.1C++的第一个程序:
cpp#include<iostream> using namespace std; int main() { cout << "helloworld" << endl; return 0; }
- 在C++输出函数printf被cout取代。换行符\n被endl取代。当然这并不意味这printf和\n在C++程序中不能运行,众所周知C++兼容C语言,因此C语言中的关键词和函数在C++中都能正常使用。
2.命名空间
2.1 namespace的价值
- 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都存在于全局变量中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字感染,namespace关键词的出现就是针对这个问题的。
- C语言类似下面程序这样的命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题:
- 这是为什么呢?原来rand原来是被定义在头文件是stdlib.h中的的一个函数。如今我们重新定义一个rand的变量就会发生重定义的问题。那我们有什么办法可以解决这样的情况呢?这里就要使用到我们的命名空间namespace了。
- 现在你看我们就可以正常使用rand变量了。
2.2namespace的定义
- 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字(这个名字可以根据自己的需求任意取),然后接一对{ }即可,{ }中即为命名空间的成员。命名空间可以定义变量/函数/类型等。
- namespace本质是定义出一个域, 这个域跟全局域各自对立,不同的域可以定义同名变量,所以上面的rand不再冲突了。
- C++中有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突的问题就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量声明周期。
- namespace只能定义在全局,当然它也可以嵌套定义。
- 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
- C++标准库都放在一个叫std(standard)的命名空间中。
2.3namespace的正常使用
- 我们定义了一个命名空间school,又在school的命名空间中又定义一个命名空间student1。
- 这也是印证了命名空间可以嵌套定义的话。
- 当然了那么namespace还可以定义函数,例如这样:
- 仔细看你会发现namespace有点像结构体,不过值得注意的是结构体的{ }后面要有";"这个符号,而命名空间不需要。其次,结构体中的成员的直接引用需要用到" ."这个符号,而命名空间需要用到"::"这个符号。
- 关于访问namespace中的空间,有三种情况:
cpp#include<stdio.h> #include<stdlib.h> namespace school { namespace student1 { char name[20]="胡图图"; char addres[20]="翻斗花园"; int age = 8; } int ADD(int x, int y) { return x + y; } } //一、指定命名空间访问 int main() { printf("%d\n", school::ADD(1,2)); return 0; } //二、using将命名空间中的某个成员展开 using school::ADD; int main() { printf("%d\n", ADD(1,2));//展开后可以直接使用命名空间school中的函数成员ADD return 0; } //三、展开命名空间中的全部成员 using namespace school; int main() { printf("%d\n", school::student1::age);//可以直接使用命名空间中的所有成员 printf("%d\n", ADD(1, 2)); return 0; }
3.C++输出和输入
- ciostream>是Input Output Stream的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
- std::cin 是istream 类的对象,它主要面向窄字符(narrow characters (of type char)) 的标准输入流。
- std::cout是ostream类的对象,它主要面向窄字符的标准输出流。
- std:endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。
- <是流插入运算符,2>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入
- 输出可以自动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。
- 10流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识一下C++10流的用法,后面我们会有专门的一个章节来细节10流库。
- cout/cin/endI等都属于C++标准库,C++标准库都放在一个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。
- 一般日常练习中我们可以using namespacestd,实际项目开发中不建议using namespace std。这里我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream=间接包含了。vS系列编译器是这样的,其他编译器可能会报错。
值得一提的是C++的输入、输入 都是自动识别变量的类型的,不用我们手动为他们匹配类型:
三、结言
咱们C++第一章就结束了,小伙伴咱们下次再见。