最近在学习一个开源项目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