结合开源项目(Sigil)学习Effective C++之一

最近在学习一个开源项目Sigil,主要是以此为参考,结合学习Effective C++,记录一些学习心得。

由于水平有限,理解的比较浅显,请多多指教。

1.尽量以const替换#define

对于单纯常量,最好以const对象替换#define

如:const int MAX_RECENT_FILES = 5; 而不要写成#define MAX_RECENT_FILES 5;

const int STATUSBAR_MSG_DISPLAY_TIME = 7000;

2.尽可以使用const

在一个函数声明式内,const可以和函数返回值,各参数,函数自身产生关联,如:

    const FolderKeeper &GetFolderKeeper() const;

    const OPFResource &GetConstOPF() const;

    void ShowMessageOnStatusBar(const QString &message = "", int millisecond_duration = STATUSBAR_MSG_DISPLAY_TIME);


3.确定对象被使用前先初始化

区分赋值和初始化

构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。注意初始列成员变量的次序应该和他们声明次序一致

    OPFResource *m_OPF;
    NCXResource *m_NCX;
    QFileSystemWatcher *m_FSWatcher;
    QString m_FullPathToMainFolder;
FolderKeeper::FolderKeeper(QObject *parent)
    :
    QObject(parent),
    m_OPF(NULL),
    m_NCX(NULL),
    m_FSWatcher(new QFileSystemWatcher()),
    m_FullPathToMainFolder(m_TempFolder.GetPath())
{
    CreateFolderStructure();
    CreateInfrastructureFiles();
}


4.绝不在构造函数和析构函数中调用Virtual函数

如:TempFolder类

TempFolder::~TempFolder()
{
    QtConcurrent::run(DeleteFolderAndFiles, m_PathToFolder);
}

bool TempFolder::DeleteFolderAndFiles(const QString &fullfolderpath)
{
    // Make sure the path exists, otherwise very
    // bad things could happen
    if (!QFileInfo(fullfolderpath).exists()) {
        return false;
    }


    QDir folder(fullfolderpath);
    // Erase all the files in this folder
    foreach(QFileInfo file, folder.entryInfoList(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot|QDir::Hidden)) {
        // If it's a file, delete it
        if (file.isFile()) {
            folder.remove(file.fileName());
        }
        // Else it's a directory, delete it recursively
        else {
            DeleteFolderAndFiles(file.absoluteFilePath());
        }
    }
    // Delete the folder after it's empty
    folder.rmdir(folder.absolutePath());
    return true;
}

类的成员函数DeleteFolderAndFiles不能为Virtual函数,DeleteFolderAndFiles是一个递归调用的函数

如果TempFolder类有一个子类,DeleteFolderAndFiles调用就会出现问题

在构造和析构函数期间不要调用virtual函数,因为这类调用不会降至derived class 

你可能感兴趣的:(结合开源项目(Sigil)学习Effective C++之一)