0

我创建了简单的片段来显示我注意到的奇怪行为。就是这样:

#include <QCoreApplication>
#include <QLineEdit>

class MyObject : public QWidget
{
public:
    explicit MyObject(QWidget *parent = 0) : QWidget(parent) {
        editor = new QLineEdit(this);
    }

    void setValue(const QString &s) const {
        editor->setText(s);
        editor->setReadOnly(true);
        editor->setMaxLength(s.length());
    }

private:
    QLineEdit *editor;
};

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    return app.exec();
}

MyObject::setValue函数有const说明符,但这段代码编译得很好。请注意setTextsetReadOnlysetMaxLength函数不是const

void setText(const QString &);
void setReadOnly(bool);
void setMaxLength(int);

我只想知道是什么导致了这种行为?我将 Qt 4.7.4 与 MingGW 4.6.2 一起使用。

4

2 回答 2

5

(这与 Qt 无关。这是一个通用的 C++ 问题。)

编译器是正确的,因为您没有修改editor. 您正在修改的是*editor;您只是在修改它指向的对象。说明const符将只禁止更改直接包含在对象中的成员。指向的对象editor不是成员,因此可以修改:

void setValue(const QString &s) const {
    editor->setText(s); // OK
    editor = new QLineEdit; // Error: 'editor' is changed.
}
于 2012-10-31T16:07:37.857 回答
0

顺便说一下,有两种方法可以查看方法的 constness:

  • 如果成员函数不修改任何对象的数据成员(不包括静态成员),则为按位常量物理常量
  • 即使对于指向的对象,逻辑常量也不允许任何更改。

正如您所经历的那样,编译器仅检测第一种类型的 constness :)

这在 Scott Meyers 编写的 Effective C++ 中的一项中进行了讨论

于 2012-10-31T16:20:52.660 回答