Qt学习(六)变量的生命周期和作用域

一..堆栈空间分配

(解释来源于百度经验)

 ①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

 ②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二.定义和使用变量的三种方式

以添加按钮组件为例。

  (1)在.h文件中添加如下代码。

QPushButton *p_button;

  在.c文件中添加如下代码。 

p_button=new QPushButton(this);
p_button->setText(QString::fromLocal8Bit("点我"));

(2) 在.h文件中添加如下代码。

QPushButton  m_button;

   在.c文件中添加如下代码。

QPushButton m_button(this);
m_button.setText(QString::fromLocal8Bit("点我"));

(3)在.h文件中添加如下代码。

QPushButton  m_button;

   在.c文件中添加如下代码。

m_button.setText(QString::fromLocal8Bit("点我"));

三.详细代码及讲解

通过创建三个窗口,分别用上述三种方式进行创建,以此来进行对比。

方式一:

在.h中添加如下代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

class CMainWindow:public QWidget
{
    Q_OBJECT
public:
    CMainWindow(QWidget *parent = 0);
    ~CMainWindow();
protected:
    void createUi();
protected slots:
    void slotButtonDown();
protected:
    QPushButton *p_button;
    int          m_index;
};

#endif // MAINWINDOW_H

在.c中添加如下代码。

#include "mainWindow.h"


CMainWindow::CMainWindow(QWidget *parent)
    :QWidget(parent)
{
    m_index = 0;
    createUi();
}

CMainWindow::~CMainWindow()
{

}

void CMainWindow::createUi()
{
    QVBoxLayout *layout = new QVBoxLayout();

    p_button=new QPushButton(this);
    p_button->setText(QString::fromLocal8Bit("点我"));
    connect(p_button,SIGNAL(released()),this,SLOT(slotButtonDown()));

    layout->addWidget(p_button);
    this->setLayout(layout);

}

void CMainWindow::slotButtonDown()
{
    QString str = QString::fromLocal8Bit("点我 %1").arg(m_index++);
    if(p_button)
        p_button->setText(str);
}

 编译运行结果如下。

Qt学习(六)变量的生命周期和作用域_第1张图片

知识点:new 建立的对象为堆,其空间一般由程序员分配释放。所以可以显示出按钮。

方式二:

在.h中添加如下代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

class CMainWindow:public QWidget
{
    Q_OBJECT
public:
    CMainWindow(QWidget *parent = 0);
    ~CMainWindow();
protected:
    void createUi2();
protected slots:
    void slotButtonDown();
protected:
    QPushButton  m_button;
    int          m_index;
};

#endif // MAINWINDOW_H

在.c中添加如下代码。

#include "mainWindow.h"


CMainWindow::CMainWindow(QWidget *parent)
    :QWidget(parent)
{
    m_index = 0;
    createUi2();
}

CMainWindow::~CMainWindow()
{

}

void CMainWindow::createUi2()
{
    QVBoxLayout *layout = new QVBoxLayout();

    QPushButton m_button(this);
    m_button.setText(QString::fromLocal8Bit("点我"));
    connect(&m_button,SIGNAL(released()),this,SLOT(slotButtonDown()));

    layout->addWidget(&m_button);
    this->setLayout(layout);
}

void CMainWindow::slotButtonDown()
{
    QString str = QString::fromLocal8Bit("点我 %1").arg(m_index++);
    if(p_button)
        p_button->setText(str);
}

编译运行结果如下。

Qt学习(六)变量的生命周期和作用域_第2张图片

知识点: m_button 为局部变量的按钮。作为栈对象,生命周期到它的createUi2()这个函数结束。函数运行完就会被删除,由操作系统自动分配释放。所以程序运行结束时,m_button的空间已经释放掉了。因此看不到按钮。

方式三:

在.h中添加如下代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

class CMainWindow:public QWidget
{
    Q_OBJECT
public:
    CMainWindow(QWidget *parent = 0);
    ~CMainWindow();
protected:
    void createUi2();
    void createUi3();
protected slots:
    void slotButtonDown();
protected:
    QPushButton  m_button;
    int          m_index;
};

#endif // MAINWINDOW_H

在.c中添加如下代码。

#include "mainWindow.h"


CMainWindow::CMainWindow(QWidget *parent)
    :QWidget(parent)
{
    m_index = 0;
    p_button = NULL;
    createUi3();
    createUi2();
}

CMainWindow::~CMainWindow()
{

}

void CMainWindow::createUi2()
{
    QVBoxLayout *layout = new QVBoxLayout();

    QPushButton m_button(this);
    m_button.setText(QString::fromLocal8Bit("点我"));
    connect(&m_button,SIGNAL(released()),this,SLOT(slotButtonDown()));

    layout->addWidget(&m_button);
    this->setLayout(layout);
}

void CMainWindow::createUi3()
{
    QVBoxLayout *layout = new QVBoxLayout();

    //QPushButton m_button(this);
    m_button.setText(QString::fromLocal8Bit("点我"));
    connect(&m_button,SIGNAL(released()),this,SLOT(slotButtonDown()));

    layout->addWidget(&m_button);
    this->setLayout(layout);
}

void CMainWindow::slotButtonDown()
{
    QString str = QString::fromLocal8Bit("点我 %1").arg(m_index++);
    if(p_button)
        p_button->setText(str);
}

编译运行结果如下。

Qt学习(六)变量的生命周期和作用域_第3张图片

知识点:类对象中和局部变量中有同名的对象时,优先使用局部变量中的。因此,可以显示出按钮。

你可能感兴趣的:(Qt学习(六)变量的生命周期和作用域)