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

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

先来看一个案例:

#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

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文件中可以找到。

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);
}


目录
相关文章
|
5天前
|
存储 程序员 编译器
C++11:声明 & 初始化
C++11:声明 & 初始化
9 0
|
5天前
|
安全 程序员 编译器
【C++类和对象】初始化列表与隐式类型转换
【C++类和对象】初始化列表与隐式类型转换
|
5天前
|
编译器 C++ 容器
【C++11(一)】右值引用以及列表初始化
【C++11(一)】右值引用以及列表初始化
|
5天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
5天前
|
编译器 C++
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
26 0
|
5天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
19 0
|
3天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算
|
5天前
|
C语言 C++ 容器
C++ string类
C++ string类
9 0
|
5天前
|
C++ Linux