Qt:静态数据成员的定义及应用

参考内容:

【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。

类声明中,对象的声明,只是告诉有这么个变量,定义属于类的对象时,才会给对象分配空间)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值