2012-10-31 67 views
0

我創建了簡單的代碼片段來顯示我注意到的奇怪行爲。就是這樣:Qt忽略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); 

我只是想知道是什麼原因導致這樣的行爲? 我用MingGW 4.6.2使用Qt 4.7.4。

回答

5

(這不是Qt的關係。這是一般的C++的問題。)

編譯器是正確的,因爲你不修改editor。你正在修改的是*editor;你只修改它指向的對象。 const說明符將僅禁止直接包含在對象中的更改成員。對象editor點是不是一個構件,因此可以進行修改:

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

哎喲書面討論!我怎麼能錯過? :) – fasked

0

順便說有看到的方法的常量性的方法有兩種:

  • 按位常量性物理常數如果成員函數不修改任何對象的數據成員(不包括靜態對象)
  • 邏輯常量不允許任何更改,即使對於指出的對象。

編譯器只檢測第一類型常量性的,因爲你經歷了:)

這在有效的C項目之一++斯科特邁爾斯