Qt忽略const说明符

时间:2012-10-31 15:59:40

标签: c++ qt qt4 const

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

#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。

2 个答案:

答案 0 :(得分:5)

(这不是Qt相关的。这是一个普通的C ++问题。)

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

void setValue(const QString &s) const {
    editor->setText(s); // OK
    editor = new QLineEdit; // Error: 'editor' is changed.
}

答案 1 :(得分:0)

顺便说一下,有两种方法可以看到方法的常量:

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

编译器只检测第一种类型的const,如您所见:)

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