C++代码的简单优化(一)

来源:互联网 发布:达内科技 设计网络营 编辑:程序博客网 时间:2024/06/05 07:20

当我们编写出实现功能的无差错的代码时,只能说工作只完成一半,还需要对代码进行各种整合,检查其命名、文件结构的规范性,代码执行效率等等的优化或重构,在这列举几个简单的C++代码优化的例子。

1.类中各变量的整合

eg:编写一个简单的MFC对话框程序,程序界面如下图所示:


刚刚入门学习MFC的可能将其各个控件变量定义如下:

//CPlayerConfigDlg.hpublic:CComboBox m_combol;int m_jumptime;int m_update;CHotKeyCtrl m_hotkey;
但有一定编程经验的MFC编写的会这样定义:

//CPlayerConfigDlg.hstruct _ST_CONFIG{int iLanguage;// 语言WORD wHotkey;// 老板键UINT uiEnHot;// 是否使能老板键int iPS;// 点击播放、暂停int iOnlyAb;// 只列出可播放的int iAutoStop;// 自动暂停int iFitVideo;// 窗口适应视频int iStepTime;// 步进时长int iUpdate;// 升级选项}m_stConfig;
将该对话框的控件变量默认定义为私有(Private),并统一放入一个结构体。这样编写,提高了类内部变量的安全性,各个区域的变量划分更明确,也方便各个模块的传递。


2.各头文件的整合。

在编写代码的过程中常常需要添加各式各样的头文件,虽然有#pragmaonce及宏定义让头文件编译一次,但依旧让文件的包含关系显得混乱。

我们可以将各系统头文件、自定义类头文件、宏定义、自定义数据类型统一放到一个头文件,然后让预编译头文件涵盖该文件。

#ifndef _CIM_DEF_H#define _CIM_DEF_H#pragma once////////////////////////////////系统头文件////////////////////////////////// 数学库#include <math.h>// 路径处理#include <shlwapi.h>// GDI+库#include <GdiPlus.h>////////////////////////////////类型、常量定义/////////////////////////// 文档操作命令enum CMD_TYPE{CMD_OPEN,     // 打开CMD_SAVE,// 保存CMD_SAVE_AS,// 另存CMD_CLOSE,// 关闭CMD_UNDO,// 撤销CMD_REDO,// 恢复};// 从 RGBQUAD指针 中取出各分量#define QUADB(p) ((LPBYTE)p)#define QUADG(p) ((LPBYTE)p + 1)#define QUADR(p) ((LPBYTE)p + 2)#define QUADA(p) ((LPBYTE)p + 3)////////////////////////////////自定义头文件////////////////////////////////// 自动初始化GDI+类,由App类继承#include "CimInitGDIP.h"// 图像类#include "CimImage.h"// 缩放控制类#include "CimScale.h"// 鼠标拖拽管理#include "CimMouse.h"/////////////////////////////类型、变量定义///////////////////////////////////////////////////////////////函数定义//////////////////////////////////#endif    // #ifndef _CIM_DEF_H

3.资源加载的整合

eg:编写需使用的GDI+的程序时,需加入GDI+加载和释放资源的代码,刚接触GDI+的可能会将这部分代码放置在App类的中:

BOOL CGDIPlustestApp::InitInstance(){//..............//GDI+资源的初始化Gdiplus::GdiplusStartupInput gdiplusStartupInput;Gdiplus::GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);//..........}
CGDIPlustestApp::~CGDIPlustest11App(){Gdiplus::GdiplusShutdown(gdiplusToken);//GDI+的释放}
然而可以使用类继承的方法来实现GDI+资源的加载和释放,构建一个专门管理GDI+的类。

//CimInitGDIP头文件#pragma onceclass CimInitGDIP{// tokenULONG_PTR m_ulToken;public:CimInitGDIP(void);~CimInitGDIP(void);};
//CimInitGDIP源文件#include "StdAfx.h"#include "CimInitGDIP.h"// 构造时自动初始化GDI+CimInitGDIP::CimInitGDIP(void){Gdiplus::GdiplusStartupInput si;Gdiplus::GdiplusStartup( &m_ulToken, &si, NULL );}// 析构时自动释放 GDI+CimInitGDIP::~CimInitGDIP(void){Gdiplus::GdiplusShutdown( m_ulToken );}
class CTestApp: public CWinApp, public CimInitGDIP// 自动初始化GDI+{public:CCIMPApp();// 重写public:virtual BOOL InitInstance();// 实现public:DECLARE_MESSAGE_MAP()};extern CCIMPApp theApp;


0 0
原创粉丝点击