【Qt6】QtCreatorで作成したウィジェット(GUI)プロジェクトのソースコードを眺めてみる

プログラミングA コンピュータ
プログラミングB

ファイル名:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

ファイル名:main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

ファイル名:mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

昔C++を学んだ記憶があるのですが、見たことのない表現と忘れてしまった部分が多々あります。

まず忘れているのは変数のスコープとオブジェクトが破棄されるタイミングです。
オブジェクトのデストラクタが呼び出されるタイミングで破棄されたような気がしましたが、C#などのガベージコレクションが使われた言語ばかり使っていたせいか、すっかり忘れています。

また、見たことのない表現ですがmain.cpp内の

QApplication a(argc, argv);

の行が見覚えが無いです。。

後の行で

return a.exec();

でaというオブジェクトのexec()メソッドを呼び出していることから、QApplication a();でオブジェクトの宣言と初期化をしているように見えます。
new演算子が省略された形でしょうか?

疑問をGoogleのGeminiにC++のスコープについて質問してみました。

Geiminiさんからの回答をまとめると以下のような感じになります。

C++にはスタック変数とヒープ変数があって、newやdeleteをするのはヒープ変数とのことです。
スタック変数は概ね宣言したブロック内での有効でブロックを抜けると解放されるようです。ヒープ変数はnewされてからdeleteされるまで有効とのことです。
それとは別にグローバル変数があって、こちらはプログラム終了まで有効とのことです。

何となく想像はできますが、実際試してみないと怖くて使えません。
QtCreateではなくC++コンパイラを使ってC++の振る舞いを確認したい。

コメント