需要解释为啥在定义类时使用一个冒号

Posted

技术标签:

【中文标题】需要解释为啥在定义类时使用一个冒号【英文标题】:Need an explanation on why is one colon used when defining classes需要解释为什么在定义类时使用一个冒号 【发布时间】:2015-10-28 11:34:17 【问题描述】:

我试图理解为什么下面的代码在子类之后使用一个冒号。我尝试在网上搜索,但没有得到有关其原因的信息。

myLabel.h 文件

    #ifndef MYLABEL_H
    #define MYLABEL_H
    #include <QApplication>
    #include <QMainWindow>
    #include <QHBoxLayout>
    #include <QLabel>
    #include <QMouseEvent>


    class MyLabel : public QLabel
    
        Q_OBJECT
    public:
        explicit MyLabel(QWidget *parent = 0);
        ~MyLabel()

    protected:
        void mouseMoveEvent ( QMouseEvent * event );

    ;

    #endif // MYLABEL_H

myLabel.cpp 文件

    #include "mylabel.h"
    #include "ui_mainwindow.h"

    MyLabel::MyLabel(QWidget *parent) : QLabel(parent) //QWidget calls the widget, QLabel calls text
    
          this->setAlignment(Qt::AlignCenter);

          //Default Label Value
          this->setText("No Value");

          //set MouseTracking true to capture mouse event even its key is not pressed
          this->setMouseTracking(true);

    

main.cpp

//#include "mainwindow.h"
#include "mylabel.h"
#include "rectangle.h"
#include <QApplication>
#include <QHBoxLayout>
#include <QPainterPath>

           int main(int argc, char *argv[])
            
                QApplication app(argc, argv);

                QMainWindow *window = new QMainWindow();

                    window->setWindowTitle(QString::fromUtf8("QT - Capture Mouse Move"));
                    window->resize(500, 450);

                    QWidget *centralWidget = new QWidget(window);
                QHBoxLayout* layout = new QHBoxLayout(centralWidget);

                    MyLabel* CoordinateLabel = new MyLabel();
                layout->addWidget(CoordinateLabel);

                window->setCentralWidget(centralWidget);

                window->show();
                return app.exec();
            



    void MyLabel::mouseMoveEvent( QMouseEvent * event )
    
        // Show x and y coordinate values of mouse cursor here
        QString txt = QString("X:%1 -- Y:%2").arg(event->x()).arg(event->y());
        setText(txt);
    

另外,有人可以解释一下 myLabel.cpp 文件中引用的指针“this”是什么吗?

谢谢大家

【问题讨论】:

哪个冒号让您感到困惑:类定义中的冒号 (class A : public B),还是构造函数中的冒号 (A::A() : B())? @JLREng 我相信在研究 Qt 程序之前,你应该首先阅读至少一本关于 C++ 的书。:) 有人能解释一下“this”引用的指针是什么吗:问 Scott Meyers。 @singerofthefall 类定义。我对构造函数很清楚,但我对定义感到困惑。 这里没有解释为什么使用冒号。这只是一个随意的规则。假设,C++ 可以被定义为允许class A public B 【参考方案1】:

这个代表继承:MyLabel类派生自QLabel类(使用公共继承,可以阅读更多here):

class MyLabel : public QLabel
    

这个调用一个特定的基类构造函数,想法是正确设置MyLabel的父控件为parent,由于QLabel将一个指向父控件的指针作为它的构造函数参数,所以这个构造函数是调用(更多信息here):

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)

在您的情况下使用 this 是不必要的。 this 成员函数内的指针指向正在运行该函数的对象。

【讨论】:

好的,现在我的问题是:如果 QLabel 正在获取一个指向父 Qwidget 的指针,那么 QLabel 参数不应该有 '*' 运算符吗? 我想我现在明白了。这是一个初始化列表的例子。除了这些家伙发布的内容之外,我建议您看一下线程:***.com/questions/120876/…

以上是关于需要解释为啥在定义类时使用一个冒号的主要内容,如果未能解决你的问题,请参考以下文章

当 RDD 包含用户定义的类时,为啥 Apache PySpark top() 会失败?

makefile中的多个冒号和等号(需要解释)

定义派生类时,为啥基类标记为“public”? [复制]

为啥 Golang 需要接口?

为啥我们需要私有构造函数?

5.1-5.2总结