摘要
妈卖批,因为这个函数进不去,emo了一下午。实际上就是因为函数声明和定义的地方漏了个const关键字。
1.正确✔:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
2.错误❌:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRID
注意那个const关键字。
const关键字加载函数名后面的作用
在C++中,const关键字用于声明常量或指定对象不可修改。
当const放在函数名后面时,表示该函数不可以修改对象的状态。它的主要作用有:
- 增强代码的健壮性。const函数不能修改对象状态,所以调用该函数不会改变对象的属性值,更不会导致崩溃或意外行为。
- 可重载。通过const和非const两种函数重载,我们可以实现基于对象状态是否改变来调用不同函数的行为。
- 减少构造与析构。const对象在被调用后,其状态不会改变,所以不会触发相关成员的构造与析构。这可以提高性能。
例如:
class Person {
public:
void eat() { ... } // 可以修改状态
void eat() const { ... } // 不可以修改状态
void run() { ... } // 可以修改状态
void run() const { ... } // 不可以修改状态
};
int main() {
Person p;
p.eat(); // 调用非const,可以修改状态
p.run(); // 调用非const,可以修改状态
const Person p2;
p2.eat(); // 调用const,不可以修改状态
p2.run(); // 调用const,不可以修改状态
}
这里,通过在函数名后加const,我们重载了eat和run两个函数。
对于非const对象,调用非const函数;
对于const对象,调用const函数。
因此,const关键字加在函数后,表明该函数不允许修改对象的状态。它带来的主要好处是:
- 增强代码健壮性
- 可重载
- 提高性能(避免多余构造与析构)