参考内容:
【1】Qt中使用全局变量的两种方式:https://blog.csdn.net/u014546553/article/details/78558925
【2】qt中的全局变量:https://www.cnblogs.com/shaozhuyong/p/5959760.html
【3】QT 全局变量 全局 函数:https://blog.csdn.net/liang890319/article/details/7062928
【4】C/C++中static关键字不同的含义详解:http://blog.sina.com.cn/s/blog_60d6fadc010140g4.html
当工程要求时,需要在类中声明并定义全局变量(静态数据成员)X
不论在其他源文件中定义多少个对象,调用的都是同一个变量(静态数据成员)X
此处只介绍使用static关键字,在类中声明并定义全局变量的方法:
使用extern引用声明的方法见参考内容。
- 如何定义全局变量(静态数据成员):
- 验证实验:
建立一个名为global的类:
global.h
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QWidget>
class Global : public QWidget
{
Q_OBJECT
public:
explicit Global(QWidget *parent = nullptr);
~Global();
static bool global;//全局变量
bool local;
signals:
public slots:
};
#endif // GLOBAL_H
global.cpp
#include "global.h"
bool Global::global = true;
Global::Global(QWidget *parent) : QWidget(parent)
{
local = true;
}
Global::~Global()
{
}
在widget中建立两个global变量
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "global.h"
#include<QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Global * global_frist;
Global * global_sec;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
global_frist = new Global(this);
global_sec = new Global(this);
qDebug()<<"全局变量演示中:";
qDebug()<<"global_frist对象的global :"<<global_frist->global;
qDebug()<<"global_sec对象的global :"<<global_sec->global;
global_frist->global = false;
qDebug()<<"改变global_frist->global的值";
qDebug()<<"global_frist对象的global :"<<global_frist->global;
qDebug()<<"global_sec对象的global :"<<global_sec->global;
qDebug()<<"局部变量演示中:";
qDebug()<<"global_frist对象的local :"<<global_frist->local;
qDebug()<<"global_sec对象的local :"<<global_sec->local;
global_frist->local = false;
qDebug()<<"改变global_frist->global的值";
qDebug()<<"global_frist对象的local :"<<global_frist->local;
qDebug()<<"global_sec对象的local :"<<global_sec->local;
}
Widget::~Widget()
{
delete ui;
}
输出结果:
从上述内容可以看出,一个问题:
类声明中,仅仅是对成员进行声明,并不会实际的去分配空间给变量,
只有创建属于类的对象时,才会给相应的对象分配具体的存储空间,并且调用类中的构造函数,进行初始化工作。
在初始化工作的工程中,分配空间给相对应的成员变量
显然,定义多个属于同一个类的对象时,分配给每一个对象的内存空间都是不同的。
这也就造成了,不同对象调用同名的对象,但是实际上调用的却是存储在不同内存空间中的内容。
如下图所示:
创建的对象有各自的成员,属于不同对象的成员也存储在不同的内存中,之间除了名称相同外,没有相关性。
但是,当工程中需要时,我们需要一个变量X,不同的对象访问X时,都是同一个X
此时,只需要将X设置为静态数据成员即可
在类声明中,进行声明,在类方法定义中,直接分配空间,所有属于这个类的对象,调用的都将是同一个变量X。
(类声明中,对象的声明,只是告诉有这么个变量,定义属于类的对象时,才会给对象分配空间)