前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++使用初始化列表的方式来初始化字段

C++使用初始化列表的方式来初始化字段

作者头像
杨源鑫
发布2019-07-12 15:06:22
1.2K0
发布2019-07-12 15:06:22
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈
先来看一个案例:
代码语言:javascript
复制
#include <iostream>
using namespace std ;
//定义一个类
class ScreenRecoveryUI 
{
  private :
    int r , g , b ; 
    char buffer[10] ;
    char *p ;
  public :
    ScreenRecoveryUI();
    void setvalue(int a , int b , int c);
    void print();
};
 
//使用初始化列表的方式初始化构造函数里的私有环境变量 
ScreenRecoveryUI::ScreenRecoveryUI():
  r(0),
  g(0),
  b(0),
  p(nullptr){
  for(int i = 0 ; i < 10 ; i++){
    buffer[i] = 0 ;
  }
} 
 
void ScreenRecoveryUI::setvalue(int a ,int b , int c)
{
  this->r = a ; 
  this->g = b ; 
  this->b = c ;
}
 
void ScreenRecoveryUI::print()
{
  cout << "r:" << this->r << endl << "g:" << this->g << endl << "b:" << b << endl ;  
}
 
int main(void)
{
  ScreenRecoveryUI screen ; 
  screen.setvalue(255,255,0);
  screen.print();
  return 0 ;
}

运行结果:

r:255

g:255

b:0

明白了上述用法以后,Android Recovery源代码里面也有类似的案例。下面这个是Recovery的一个构造函数,代码位于:screen_ui.cpp,它的类的实现在screen_ui.h。如下这个ScreenRecoveryUI类,这个类是继承于RecoveryUI类的,这个文件在screen_ui.h

代码语言:javascript
复制
class ScreenRecoveryUI : public RecoveryUI {
  public:
    ScreenRecoveryUI();
 
    void Init();
    void SetLocale(const char* locale);
 
    // overall recovery state ("background image")
    void SetBackground(Icon icon);
 
    // progress indicator
    void SetProgressType(ProgressType type);
    void ShowProgress(float portion, float seconds);
    void SetProgress(float fraction);
 
    void SetStage(int current, int max);
 
    // text log
    void ShowText(bool visible);
    bool IsTextVisible();
    bool WasTextEverVisible();
 
    // printing messages
    void Print(const char* fmt, ...) __printflike(2, 3);
    void ShowFile(const char* filename);
 
    // menu display
    void StartMenu(const char* const * headers, const char* const * items,
                   int initial_selection);
    int SelectMenu(int sel);
    void EndMenu();
 
    void KeyLongPress(int);
 
    void Redraw();
 
    enum UIElement {
        HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
    };
    void SetColor(UIElement e);
 
  private:
    Icon currentIcon;
    int installingFrame;
    const char* locale;
    bool rtl_locale;
 
    pthread_mutex_t updateMutex;
    GRSurface* backgroundIcon[5];
    GRSurface* backgroundText[5];
    GRSurface** installation;
    GRSurface* progressBarEmpty;
    GRSurface* progressBarFill;
    GRSurface* stageMarkerEmpty;
    GRSurface* stageMarkerFill;
 
    ProgressType progressBarType;
 
    float progressScopeStart, progressScopeSize, progress;
    double progressScopeTime, progressScopeDuration;
 
    // true when both graphics pages are the same (except for the progress bar).
    bool pagesIdentical;
 
    size_t text_cols_, text_rows_;
 
    // Log text overlay, displayed when a magic key is pressed.
    char** text_;
    size_t text_col_, text_row_, text_top_;
 
    bool show_text;
    bool show_text_ever;   // has show_text ever been true?
 
    char** menu_;
    const char* const* menu_headers_;
    bool show_menu;
    int menu_items, menu_sel;
 
    // An alternate text screen, swapped with 'text_' when we're viewing a log file.
    char** file_viewer_text_;
 
    pthread_t progress_thread_;
 
    int animation_fps;
    int installing_frames;
 
    int iconX, iconY;
 
    int stage, max_stage;
 
    void draw_background_locked(Icon icon);
    void draw_progress_locked();
    void draw_screen_locked();
    void update_screen_locked();
    void update_progress_locked();
 
    static void* ProgressThreadStartRoutine(void* data);
    void ProgressThreadLoop();
 
    void ShowFile(FILE*);
    void PutChar(char);
    void ClearText();
 
    void DrawHorizontalRule(int* y);
    void DrawTextLine(int* y, const char* line, bool bold);
    void DrawTextLines(int* y, const char* const* lines);
 
    void LoadBitmap(const char* filename, GRSurface** surface);
    void LoadBitmapArray(const char* filename, int* frames, GRSurface*** surface);
    void LoadLocalizedBitmap(const char* filename, GRSurface** surface);
};

下面是这个类的构造函数的实现,其中构造函数就采用了初始化列表的方式来初始化字段,以下构造函数的实现在screen_ui.cpp文件中可以找到。

代码语言:javascript
复制
ScreenRecoveryUI::ScreenRecoveryUI() :
    currentIcon(NONE),
    installingFrame(0),
    locale(nullptr),
    rtl_locale(false),
    progressBarType(EMPTY),
    progressScopeStart(0),
    progressScopeSize(0),
    progress(0),
    pagesIdentical(false),
    text_cols_(0),
    text_rows_(0),
    text_(nullptr),
    text_col_(0),
    text_row_(0),
    text_top_(0),
    show_text(false),
    show_text_ever(false),
    menu_(nullptr),
    show_menu(false),
    menu_items(0),
    menu_sel(0),
    file_viewer_text_(nullptr),
    animation_fps(20),
    installing_frames(-1),
    stage(-1),
    max_stage(-1) {
 
    for (int i = 0; i < 5; i++) {
        backgroundIcon[i] = nullptr;
    }
    pthread_mutex_init(&updateMutex, nullptr);
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式开发圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档