文章目录
1.头文件
1.头文件是什么?
简单描述头文件作用:
- 把需要用到的变量、函数等信息,罗列在头文件里面(可以理解为新华字典里面的每个汉字), 运行文件直接引用头文件,然后就可以使用这个变量或者函数了。
- 但是,具体这个函数是干了哪些事情(这个汉字的详细解释),这个可以在其他文件里面定义。
- 这样做的好处是:可以统筹管理所有变量和函数、找起来会比较快(例如第一行是函数名,第200行才结束,你看到201行才能找到第二个函数,岂不是非常麻烦)
看看专业的解释:
- 头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。
百度百科: 头文件
2.C/C++头文件啥区别?
c的头文件都是以.h结尾,如stdio.h、math.h
c++的头文件:
- c++保留了c中的头文件风格,即大部分c的头文件都可以在c++中使用,也可以自定义c类型头文件在c++中使用
- c的标准头文件在c++中去掉了.h后缀,添加了c前缀,如math.h改为cmath
- c++自身的头文件,不带后缀,如iostream,其最大的不同就是c++类型头文件可以包含命名空间,而.h后缀的则不行
看到其他大神些的博客,头文件最好不要使用命名空间namespace:
https://blog.csdn.net/qq_41230365/article/details/80191964
3.如何使用头文件呢?
//header_02.h文件, 仅仅定义了一个函数
void alien();
// func.cpp源文件, 对函数alien有个详细的实现
#include "header_01.h"
#include <iostream>
using namespace std;
void alien() {
cout << "alien函数的实现" << endl;
int age = 28;
cout << age << endl;
}
// run.cpp源文件,这个是引用了头文件,就可实现对函数的调用
#include <iostream>
#include <ctime>
#include "header_01.h"
int main()
{
alien();
cout << "hello主函数的实现" << endl;
}
//最终实现的结果为:
alien函数的实现
28
hello主函数的实现
2.using关键字
1.声明变量的作用
在使用using之前,如果全局变量和局域变量同时存在的时候,函数会自动使用全局变量。如果我们想使用的是局域变量,那就没办法了。
#include <iostream>
using namespace std;
int age = 28;
namespace alien {
int age = 18;
}
void fun_01(){
cout << age << endl;
}
int main(){
fun_01();
getchar();
}
28
//因为程序头部,设置了全局变量28, 命名空间alien里面,虽然也有一个age,但是算局域变量。
//最终, fun_01函数没有在函数体里面发现局域变量,就只能找到全局变量age了
如上情况,我们需要指明,要使用的是局域变量,using的作用就是这个,请看
#include <iostream>
using namespace std;
int age = 28;
namespace alien {
int age = 18;
}
void fun_01(){
using alien::age; # 只是比上面添加了这一行代码,就可以指明使用的是局域变量
cout << age << endl;
}
int main(){
fun_01();
getchar();
}
18
// alien 命名空间下的age
局域变量和命名空间,不能在一个函数体里面,这样会导致函数有个【二义性】,函数不知道应该选择哪个变量,最终报错
#include <iostream>
using namespace std;
namespace alien {
int age = 18;
}
void fun_01(){
int age = 28; //先指明一个变量
using alien::age; //再引用一个局域变量
cout << age << endl;
}
int main(){
fun_01();
getchar();
}
函数会报如下的错误
2.编译指令的作用
可以理解为编译指令----打开某个命名空间,方便下面代码去使用次命名空间里面的变量
#include <iostream>
using namespace std;
namespace alien {
int age = 18;
}
void fun_01(){
int age = 18;
using namespace alien; //此处相当于打开了命名空间
cout << age << endl; //但,此处没用到上面的命名空间,而是用了局部变量
}
int main(){
fun_01();
getchar();
}
但如上的案例,不是我们推荐的使用方式,正确的如何:
#include <iostream>
using namespace std;
namespace alien {
int age = 18;
}
namespace ware {
int age = 28;
}
void fun_01(){
using namespace alien; # 通过using打开多个命名空间
using namespace ware;
cout << ware::age << endl; #在不同的地方,使用不同命名空间的变量
}
int main(){
fun_01();
getchar();
}
3. namespace命名空间的使用
0.命名空间的定义:
https://blog.csdn.net/qq_40416052/article/details/82528676
- 命名空间下,可以存放函数、变量、结果体、类等等
- 命名空间,必须定义在全局作用域下面
- 命名空间,可以嵌套定义命名空间
- 命名空间是开放的,可以往命名空间里面添加内容
- 命名空间可以是无名的、匿名的
- 命名空间,可以使用别名
1.命名空间的应用
当我们定义某个函数的时候,不同的场景需要实现的功能不一样。那么我们就可以把函数放在不同的命名空间里面,这样同一个函数名,我使用不同空间下面的函数,得到的结果就可以不一样了。
// header_01.h, 定义了命名空间Alien,以及函数studying
namespace Alien {
void studying();
}
// header_02.h, 定义了命名空间Alien02,以及函数studying
namespace Alien02 {
void studying();
}
//func_01.cpp, 实现了Alien空间下的studying的功能
#include "header_01.h"
#include <iostream>
using namespace std;
void Alien::studying() {
cout << "C语言的学习" << endl;
int age = 18;
cout << age << endl;
}
//func_02.cpp, 实现了Alien02空间下的studying的功能
#include "header_02.h"
#include <iostream>
using namespace std;
void Alien02::studying() {
cout << "C++语言的学习" << endl;
int age = 28;
cout << age << endl;
}
// run.cpp文件,实现了最终调用的过程
#include <iostream>
#include "header_01.h"
#include "header_02.h"
using namespace std;
int main()
{
cout << "run文件main函数-----start" << endl;
Alien::studying();
Alien02::studying();
cout << "run文件main函数-----end" << endl;
return 0;
}
//最终结果
run文件main函数-----start
C语言的学习
18
C++语言的学习
28
run文件main函数-----end
2.注意事项:
- 最终调用的时候,如果引用2个头文件,且这2个头文件都有某个函数名的话,需要指明具体是哪个命名空间下的函数
#include <iostream>
#include "header_01.h"
#include "header_02.h"
using namespace std;
int main()
{
cout << "run文件main函数-----start" << endl;
studying(); //错误用法,因为没有指明具体是哪个命名空间下的studying函数
cout << "run文件main函数-----end" << endl;
return 0;
}
-
只要使用cout函数,理论上当前文件就需要使用标准命名空间(std)以及引用输入输出头文件(iostream),但是如果在引用的头文件header_01.h或header_02.h里面,如果已经使用标准命名空间(std)和输入输出头文件,那么当前文件(run.cpp)文件就不需要再使用了。-----也就是说,c++支持命名空间和头文件的递归引用
-
在func_01.cpp & func_02.cpp 中,需要指明命名空间下的函数,-----命名空间::函数名
void Alien02::studying() {
}
- 如果不使用标准命名空间(std), 就不能直接使用cout函数,需要std::cout才行,但这样看起来比较臃肿
3.命名空间嵌套定义命名空间
#include <iostream>
using namespace std;
namespace Alien01 {
int age = 18;
namespace Alien02 {
int age = 28;
}
}
void main() {
cout << Alien01::age << endl;
cout << Alien01::Alien02::age << endl; //多级命名空间嵌套调用
}
// 最终结果如下:
18
28
4.命名空间是开放的,可以往命名空间里面添加内容
#include <iostream>
using namespace std;
namespace Alien {
int age = 18;
}
namespace Alien {
int height = 188;
}
void main() {
cout << Alien::age << endl;
cout << Alien::height << endl;
}
// 最终结果:
18
188
5.命名空间,可以是无名的、匿名的
如果是无名的、匿名的,那么里面的变量相当于静态变量,只能在当前文件里面使用,不能被其他文件调用,所以这个很少用,也不推去使用
#include <iostream>
using namespace std;
namespace {
int age = 18;
}
void main() {
cout << age << endl;
}
6.命名空间可以起别名
#include <iostream>
using namespace std;
namespace veryLongName {
int age = 18;
}
void main() {
namespace v = veryLongName;
cout << v::age << endl;
}