亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-05-23 13:24:05
字體:
來源:轉載
供稿:網友

幾個月之前,接觸Android recovery源代碼的時候,看ScreenRecoveryUI類的時候,那時候C++基礎還不是特別好,一直不明白以下的初始化方式:

下面這個是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);}

可以來看看RecoveryUI類:

在ui.h中:

class RecoveryUI { public:  RecoveryUI();  virtual ~RecoveryUI() { }  // Initialize the object; called before anything else.  virtual void Init();  // Show a stage indicator. Call immediately after Init().  virtual void SetStage(int current, int max) = 0;  // After calling Init(), you can tell the UI what locale it is operating in.  virtual void SetLocale(const char* locale) = 0;  // Set the overall recovery state ("background image").  enum Icon { NONE, INSTALLING_UPDATE, ERASING, NO_COMMAND, ERROR };  virtual void SetBackground(Icon icon) = 0;  // --- progress indicator ---  enum ProgressType { EMPTY, INDETERMINATE, DETERMINATE };  virtual void SetProgressType(ProgressType determinate) = 0;  // Show a progress bar and define the scope of the next operation:  //  portion - fraction of the progress bar the next operation will use  //  seconds - expected time interval (progress bar moves at this minimum rate)  virtual void ShowProgress(float portion, float seconds) = 0;  // Set progress bar position (0.0 - 1.0 within the scope defined  // by the last call to ShowProgress).  virtual void SetProgress(float fraction) = 0;  // --- text log ---  virtual void ShowText(bool visible) = 0;  virtual bool IsTextVisible() = 0;  virtual bool WasTextEverVisible() = 0;  // Write a message to the on-screen log (shown if the user has  // toggled on the text display).  virtual void Print(const char* fmt, ...) __printflike(2, 3) = 0;  virtual void ShowFile(const char* filename) = 0;  // --- key handling ---  // Wait for a key and return it. May return -1 after timeout.  virtual int WaitKey();  virtual bool IsKeyPressed(int key);  virtual bool IsLongPress();  // Returns true if you have the volume up/down and power trio typical  // of phones and tablets, false otherwise.  virtual bool HasThreeButtons();  // Erase any queued-up keys.  virtual void FlushKeys();  // Called on each key press, even while operations are in progress.  // Return value indicates whether an immediate operation should be  // triggered (toggling the display, rebooting the device), or if  // the key should be enqueued for use by the main thread.  enum KeyAction { ENQUEUE, TOGGLE, REBOOT, IGNORE };  virtual KeyAction CheckKey(int key, bool is_long_press);  // Called when a key is held down long enough to have been a  // long-press (but before the key is released). This means that  // if the key is eventually registered (released without any other  // keys being pressed in the meantime), CheckKey will be called with  // 'is_long_press' true.  virtual void KeyLongPress(int key);  // Normally in recovery there's a key sequence that triggers  // immediate reboot of the device, regardless of what recovery is  // doing (with the default CheckKey implementation, it's pressing  // the power button 7 times in row). Call this to enable or  // disable that feature. It is enabled by default.  virtual void SetEnableReboot(bool enabled);  // --- menu display ---  // Display some header text followed by a menu of items, which appears  // at the top of the screen (in place of any scrolling ui_print()  // output, if necessary).  virtual void StartMenu(const char* const * headers, const char* const * items,              int initial_selection) = 0;  // Set the menu highlight to the given index, wrapping if necessary.  // Returns the actual item selected.  virtual int SelectMenu(int sel) = 0;  // End menu mode, resetting the text overlay so that ui_print()  // statements will be displayed.  virtual void EndMenu() = 0;protected:  void EnqueueKey(int key_code);private:  // Key event input queue  pthread_mutex_t key_queue_mutex;  pthread_cond_t key_queue_cond;  int key_queue[256], key_queue_len;  char key_pressed[KEY_MAX + 1];   // under key_queue_mutex  int key_last_down;         // under key_queue_mutex  bool key_long_press;        // under key_queue_mutex  int key_down_count;        // under key_queue_mutex  bool enable_reboot;        // under key_queue_mutex  int rel_sum;  int consecutive_power_keys;  int last_key;  bool has_power_key;  bool has_up_key;  bool has_down_key;  struct key_timer_t {    RecoveryUI* ui;    int key_code;    int count;  };  pthread_t input_thread_;  void OnKeyDetected(int key_code);  static int InputCallback(int fd, uint32_t epevents, void* data);  int OnInputEvent(int fd, uint32_t epevents);  void ProcessKey(int key_code, int updown);  bool IsUsbConnected();  static void* time_key_helper(void* cookie);  void time_key(int key_code, int count);};ui.cpp中,也是采用字段初始化的方式來實現構造函數:RecoveryUI::RecoveryUI()    : key_queue_len(0),     key_last_down(-1),     key_long_press(false),     key_down_count(0),     enable_reboot(true),     consecutive_power_keys(0),     last_key(-1),     has_power_key(false),     has_up_key(false),     has_down_key(false) {  pthread_mutex_init(&key_queue_mutex, nullptr);  pthread_cond_init(&key_queue_cond, nullptr);  memset(key_pressed, 0, sizeof(key_pressed));}

現在看明白了。

寫一個測試案例看看就懂了,果然一例解千愁?。?/p>

#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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品日本高清在线播放| 成人免费福利视频| 欧美色视频日本高清在线观看| 欧美精品videossex性护士| 久久久亚洲福利精品午夜| 日韩美女免费线视频| 国内精品久久久久影院 日本资源| 国产精品久久久久久久午夜| 国产精品免费视频久久久| 91免费精品国偷自产在线| 久久人91精品久久久久久不卡| 亚洲欧美成人一区二区在线电影| 欧美高清激情视频| 久久资源免费视频| 日韩电影大片中文字幕| 国产成人精品在线| 人妖精品videosex性欧美| 草民午夜欧美限制a级福利片| 午夜美女久久久久爽久久| 国自在线精品视频| 欧美激情综合色| 成人亚洲欧美一区二区三区| 国产一区二区三区直播精品电影| 欧美成人精品不卡视频在线观看| 日本亚洲精品在线观看| 久久国内精品一国内精品| 亚洲精品国产品国语在线| 亲爱的老师9免费观看全集电视剧| 亚洲一区二区三区在线视频| 国产精品青青在线观看爽香蕉| 欧美—级a级欧美特级ar全黄| 欧美日韩在线看| 亚洲男人天堂2019| 57pao国产成人免费| 欧美国产激情18| 日韩a**站在线观看| 欧美国产精品va在线观看| 欧美激情第1页| 成人免费高清完整版在线观看| 亚洲乱码国产乱码精品精| 久久视频免费观看| 亚洲精品美女在线观看播放| 精品成人国产在线观看男人呻吟| 欧美日韩中文字幕日韩欧美| 久久在线视频在线| 91免费版网站入口| 亚洲国产成人精品久久久国产成人一区| 一夜七次郎国产精品亚洲| 伦伦影院午夜日韩欧美限制| 日韩美女视频免费在线观看| 欧美黑人一区二区三区| 欧美黄色片在线观看| 国产成人a亚洲精品| 久久久久中文字幕2018| 亚洲高清不卡av| 国内精品久久久久伊人av| 亚洲电影免费观看| 久久久国产精品视频| 精品国产乱码久久久久久天美| 国产精品免费一区| 成人天堂噜噜噜| 在线观看久久av| 久久影院资源网| 97久久久免费福利网址| 久久久久久久久久久久av| 国产精品美腿一区在线看| 久热精品视频在线| 97精品国产97久久久久久春色| 亚洲xxxx视频| 成人黄色影片在线| 欧美激情按摩在线| 日韩欧美在线观看| 成人乱人伦精品视频在线观看| 成人观看高清在线观看免费| 69久久夜色精品国产69| 亚洲精品99久久久久| 欧美成人免费视频| 中文字幕免费国产精品| 日韩视频一区在线| 国产欧美精品一区二区| 69久久夜色精品国产7777| 欧美成人一二三| 日韩视频第一页| 亚洲黄色片网站| 98精品国产自产在线观看| 亚洲一二三在线| 亚洲美女久久久| 日韩小视频在线| 欧美野外wwwxxx| 亚洲欧美一区二区三区久久| 亚洲人成网站色ww在线| 欧美日韩亚洲一区二| 亚洲综合中文字幕在线| 欧美午夜性色大片在线观看| 久久免费视频在线观看| 日本高清不卡在线| 91精品视频在线播放| 国产成人精品久久二区二区| 欧美成人午夜激情在线| 成人字幕网zmw| 国产精品久久国产精品99gif| 亚洲一区二区三区四区视频| 精品国内产的精品视频在线观看| 成人高h视频在线| 国产精品日日摸夜夜添夜夜av| 久久综合久久美利坚合众国| 亚洲国产欧美在线成人app| 欧美日韩亚洲视频一区| 久久成人亚洲精品| 4438全国亚洲精品在线观看视频| 国产精品1区2区在线观看| 日韩欧美在线视频日韩欧美在线视频| 97久久精品人人澡人人爽缅北| 国产一区二区三区久久精品| 日韩在线视频导航| 亚洲最大在线视频| 久久99久国产精品黄毛片入口| 欧美成年人视频网站| 亚洲福利在线看| 国产精品视频午夜| 亚洲美女av在线| 成人免费激情视频| 一本色道久久综合狠狠躁篇的优点| 国产91精品网站| 亚洲肉体裸体xxxx137| 国产91在线播放九色快色| 欧美视频免费在线观看| 国产亚洲激情在线| 久精品免费视频| 国产一级揄自揄精品视频| 九九精品在线观看| 欧美性极品少妇精品网站| 日本伊人精品一区二区三区介绍| 亚洲欧美另类中文字幕| 91理论片午午论夜理片久久| 国产精品一区二区三区久久久| 久久久国产91| 性色av一区二区三区红粉影视| 日韩av在线网址| 亚洲国产精品久久久久秋霞不卡| 日韩欧美主播在线| 热re91久久精品国99热蜜臀| 亚洲午夜性刺激影院| 日本韩国欧美精品大片卡二| 91在线观看免费网站| 国产精品免费视频xxxx| 日韩视频免费观看| 亚洲欧洲视频在线| 日韩av在线天堂网| 97在线视频免费观看| 国产一区二区色| 三级精品视频久久久久| 91av视频在线免费观看| 久久伊人精品天天| 亚洲欧美制服综合另类| 狠狠色噜噜狠狠狠狠97| 国产狼人综合免费视频| 成人免费福利视频| 亚洲欧洲日产国码av系列天堂| 在线亚洲午夜片av大片| 亚洲国产美女精品久久久久∴| 亚洲激情久久久| 国产精品福利无圣光在线一区| 九色成人免费视频|