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++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
161 12
|
11月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
141 3
|
11月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
217 3
|
11月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
11月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
11月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
87 0
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
83 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
164 0
|
6月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
124 16