关键解决点是使用extern,还有就是理解C++声明、定义、赋值。
声明是告诉程序,这个地方有个变量,定义是为变量开辟空间,赋值是开辟空间后给值
一、基础用法
例如下面这个a.cpp程序:
#include "myhead.h"
#include <iostream>
int main()
{
std::cout << a;
}
我明明没有定义a,为什么没有报错呢?原因在于我引入了我自定义的头文件#include “myhead.h”,下面是头文件中内容:
extern int a;
我们知道include作用只是代码搬运作用,即include作用是把myhead.h文件内代码复制到a.cpp。那么其实两个文件可以合并为:
#include <iostream>
extern int a;
int main()
{
std::cout << a;
}
上面代码与平时代码还是有些区别就是多了一个extern,extern int a;其实就是声明,并没有定义,a真正在哪定义呢?可能是在另一个thrid.c文件中,thrid.cpp文件内容可能是:
int a;
到此为止a就是一个全局变量。为何是全局变量呢,例如a.c文件它直接引入一个#include “myhead.h”就直接用变量a的值了,假如再创建一个.cpp文件,此时再#include “myhead.h”那么也可以直接使用变量a了,这样就实现了全局功能
在a.cpp使用变量a时候可以为a赋值,这样就能更改a值了,如果a声明时候是一个const常量,那么a只可以使用,不可以改变
二、类与结构体作为全局变量
下面再看看如果是一个类,如何把这个类的一个实例作为全局的实例:
以类举例:
第一步,创建一个文件用于放类的定义(此定义不是那种开辟空间的定义),文件名为Student.h
#include <stdio.h>
class Student {
public: //类包含的变量
char *name;
int age;
float score;
public: //类包含的函数
void say() {
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
};
第二步,创建一个文件用于定义这个类实例Student.cpp
#include "Student.h"
Student stu;
第三步,之前那个myhead.h头文件中加入stu的声明
#include "Student.h"
extern int a;
extern Student stu;
最后任意一个文件的只要引入myhead.h头文件即可直接用stu,如在a.cpp文件中
#include "myhead.h"
#include <iostream>
int main()
{
a = 8;
std::cout << a;
stu.name = "qqq";
stu.say();
}