1、namespace Ui分析
mainwindow.cpp和对应头文件代码
/*****************************mainwindow.cpp中的头文件声明************************/
#include "mainwindow.h"
#include "ui_mainwindow.h"
/*******************************mainwindow.h**************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } //命名空间第一次定义,内部是个类声明
QT_END_NAMESPACE
class MainWindow : public QMainWindow //此class MainWinwod类不属于命名空间
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui; //使用了命名空间的class MainWindow类为指针类型
};
#endif // MAINWINDOW_H
/*********************************ui_mainwindow.h****************************/
//此为ui界面头文件中部分语句
class Ui_MainWindow {......}; //{}内语句已省略
namespace Ui { //命名空间第二次定义(注:多次定义会自动合并)
class MainWindow: public Ui_MainWindow {};
}
分析:编译的预处理阶段,会把所有.h头文件直接复制过来,相当于合并成一个文件,所以读头文件需要按顺序来读
mainwindow.cpp中第一个头文件为#include "mainwindow.h"。这里第一次定义命名空间namespace Ui,内部只有一个class MainWindow类声明,用于下面不处于命名空间而处于全局区的class MainWindow类的一个成员(即两个类同名,但不是同一个)
关于命名空间Ui中class MainWindow类定义则在第二个头文件#include "ui_mainwindow.h"中
很明显此类的定义没有新增成员,仅仅就继承了 class Ui_MainWindow 类,这里面就储存了绘制的界面、按钮等等成员和接口。
2、关于命名空间
多个同名的命名空间定义出现,系统会自动合并,也就是说后续出现的同名命名空间,直接按顺序合并即可(注:出现函数、类的重复定义会报错,但重复声明并不会。如下,并不会报错:)
使用命名空间的3种方法如下:
using namespace 空间名; //此语句后可直接使用该空间内的所有成员
using 空间名::成员名; //此语句后的可直接使用该成员
cout << 空间名::成员 << endl;
(除此之外,就算是命名空间的定义,内部的成员也跟后面的语句没有关系,因为都是独立的空间) 关于更多命名空间可以看此 C++命名空间