第二章

来源:互联网 发布:pycharm安装教程linux 编辑:程序博客网 时间:2024/06/07 14:27

有些特别基本常用的就不说了,说一些不怎么关注而又模糊的:

1、头文件名称格式
比较常用又比较乱的就是,经常看到三类:
带.h的 #include <iostream.h>#include <math.h>
带c的 #include <cmath>
啥都不带的 #include <iostream>

大概说一下,其实这个头文件的命名就是C++不断更新遗留下来的,首先一点就是c++对c语言肯定是支持的。
1、最早期,C语言的头文件用.h格式。例如math.h\
2、早期的C++也就照着C格式的.h用。例如math.h和iostream.h
3、随着C++更新,要与C区分,区分就带来两个类别:
一、在C++时代才有的,只为C++写的头文件,在C中压根没有的。
例如 iostream.h(C语言中用的是stdio.h),这种就直接把.h去掉吧,啥都不用了。就这样:iostream
二、C时代写的,感觉还不错的,到了C++还要用的。
例如 math.h,这种也得把.h去掉,为了跟上面的一类区分,前面加个c吧,表示是从c语言搞过来的。就这样:cmath

说一下去掉.h不是就为了格式上的变化,主要是没有.h的头文件可以包含名称空间。下方总结一个表:
这里写图片描述

下面继续,来看看iostream.h和iostream的区别。
前面说到去掉.h可以用名称空间,名称空间(namespace)是由标准C++引入的,是一种新的作用域级别。原来C++标识符的作用域分为三级:代码块({…}和函数体)、类域和全局作用域。如今,在类作用域和全局作用域之间,C++标准又添加了名字空间域这一个作用域级别。
命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。
比如说你想自己定义一个swap函数,如果不封装在自己的名称空间,你会发现会报错,因为在std::名称空间中有个同名的swap函数,这就冲突了。如果用名称空间进行隔离:std::swap(); mynamespace::swap(); 这样就不会冲突。
所以我们在程序中最常用的cout,endl,其实都是std::cout std::endl;
问题来了,每一个都加上std::好像很麻烦,good question,using指令来了。
两种方式:将用到的指令一个个using出来:

using std::cout;using std::endl;using std::cin;

那么问题又来了,用多了貌似好像也是很麻烦。
直接暴露整个名称空间好了:

using namespace std

两种方式各有利弊,第一种是用哪个暴露哪个,比较谨慎,不会意外的暴露别的而产生冲突,问题就是比较麻烦;第二种就是直接暴露整个名称空间,方便,但是容易意外暴露其他的而产生冲突,比如swap()函数,如果你自己定义了一个,莫名的就会有错误。
还是没说道这个名称空间跟上面的头文件格式有啥关系呢?
来看代码:

#include <iostream>int main(){    std::cout << "Hello, World!" << std::endl;    return 0;}

这代码,没毛病,完美。
换一下.h头文件呢?

这里写图片描述

std::报错了,说明.h格式的头文件不支持命名空间,所以这样看到话,iostream和iostream.h还真是两个不同的东西。
试试用.h的格式,然后下面去掉名称空间呢?
这里写图片描述
还是不行,估计是用法太老了,点错误,显示没有此头文件都。
所以总结来看,对于C++而言还是尽量用啥都没有或者c开头的头文件,这些是正规军。

原创粉丝点击