代码之家  ›  专栏  ›  技术社区  ›  messenger

对正在进行的返回值转换的解释

  •  1
  • messenger  · 技术社区  · 16 年前
    #include <Fl/Enumerations.H>
    class Color
    {
        public:
            static Color amber () {return fl_rgb_color (255, 204, 0);}
            static Color lighter_gray () {return fl_rgb_color (40, 40, 40); }
            static Color light_gray () {return fl_rgb_color (179, 179, 179);}
            static Color gray () {return fl_rgb_color (100, 100, 100);}
            static Color light_blue () {return fl_rgb_color (107, 107, 255);}
            static Color white () {return FL_WHITE;}
            static Color off_white() { return fl_rgb_color(225, 225, 225); }
            static Color cream() { return fl_rgb_color(204, 236, 255); }
            static Color black () {return FL_BLACK;}
            static Color red () {return FL_RED;}
            static Color green () {return FL_GREEN;}
            static Color dark_green () {return fl_rgb_color (0, 169, 45);}
            static Color blue () {return FL_BLUE;}
            static Color background () {return FL_BACKGROUND_COLOR;}
    
            Color (const Fl_Color& c = Color::black ()) : fl_color_ (c) {}
            operator Fl_Color () const {return fl_color_;}
            void make_current () const;
    
        private:
            Fl_Color fl_color_;
    };
    

    enum Fl_Color { // standard colors
      // These are used as default colors in widgets and altered as necessary
      FL_FOREGROUND_COLOR   = 0,
      FL_BACKGROUND2_COLOR  = 7,
      FL_INACTIVE_COLOR = 8,
      FL_SELECTION_COLOR    = 15,
    
      // boxtypes generally limit themselves to these colors so
      // the whole ramp is not allocated:
      FL_GRAY0      = 32,   // 'A'
      FL_DARK3      = 39,   // 'H'
      FL_DARK2      = 45,   // 'N'
      FL_DARK1      = 47,   // 'P'
      FL_BACKGROUND_COLOR   = 49,   // 'R' default background color
      FL_LIGHT1     = 50,   // 'S'
      FL_LIGHT2     = 52,   // 'U'
      FL_LIGHT3     = 54,   // 'W'
    
      // FLTK provides a 5x8x5 color cube that is used with colormap visuals
      FL_BLACK      = 56,
      FL_RED        = 88,
      FL_GREEN      = 63,
      FL_YELLOW     = 95,
      FL_BLUE       = 216,
      FL_MAGENTA        = 248,
      FL_CYAN       = 223,
      FL_DARK_RED       = 72,
    
      FL_DARK_GREEN     = 60,
      FL_DARK_YELLOW    = 76,
      FL_DARK_BLUE      = 136,
      FL_DARK_MAGENTA   = 152,
      FL_DARK_CYAN      = 140,
    
      FL_WHITE      = 255
    };
    
    #define FL_FREE_COLOR       (Fl_Color)16
    #define FL_NUM_FREE_COLOR   16
    #define FL_GRAY_RAMP        (Fl_Color)32
    #define FL_NUM_GRAY     24
    #define FL_GRAY         FL_BACKGROUND_COLOR
    #define FL_COLOR_CUBE       (Fl_Color)56
    #define FL_NUM_RED      5
    #define FL_NUM_GREEN        8
    #define FL_NUM_BLUE     5
    
    FL_EXPORT Fl_Color fl_inactive(Fl_Color c);
    FL_EXPORT Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg);
    FL_EXPORT Fl_Color fl_color_average(Fl_Color c1, Fl_Color c2, float weight);
    inline Fl_Color fl_lighter(Fl_Color c) { return fl_color_average(c, FL_WHITE, .67f); }
    inline Fl_Color fl_darker(Fl_Color c) { return fl_color_average(c, FL_BLACK, .67f); }
    inline Fl_Color fl_rgb_color(uchar r, uchar g, uchar b) {
    
      if (!r && !g && !b) return FL_BLACK;
      else return (Fl_Color)(((((r << 8) | g) << 8) | b) << 8);
    }
    inline Fl_Color fl_rgb_color(uchar g) {
      if (!g) return FL_BLACK;
      else return (Fl_Color)(((((g << 8) | g) << 8) | g) << 8);
    }
    inline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}
    inline Fl_Color fl_color_cube(int r, int g, int b) {
      return (Fl_Color)((b*FL_NUM_RED + r) * FL_NUM_GREEN + g + FL_COLOR_CUBE);}
    

    关于返回FL_颜色枚举的静态类定义,我无法完全理解下面的类中发生了什么。我看不出Fl_Color怎么会知道Color类,编译器怎么会知道如何将Fl_颜色转换成颜色。我确实意识到颜色有一个隐式的转换为Fl_颜色,但我不认为转换是双向的。这是怎么回事?编译器是否只是调用构造函数并将返回值作为第一个参数传入?

    4 回复  |  直到 16 年前
        1
  •  3
  •   CB Bailey    16 年前

    返回 Color 全部返回调用的结果 fl_rgb_color .

    fl_rgb_颜色 返回一个 Fl_Color 具有未标记的单参数构造函数 explicit 并引用一个常量 彩色 这是一个有效的隐式转换。

    的返回值 是暂时的,但因为 承担 参数由一个 const 引用将临时变量绑定到构造函数参数是合法的。它的使用寿命一直持续到建筑完工 对象(本身也是返回值的临时对象)完成。

        2
  •  0
  •   user224003    16 年前

    在返回之前,隐式地在F1_颜色上运行颜色构造函数

        3
  •  0
  •   Carlos A. Ibarra    16 年前

    Color的构造函数接受Fl_Color参数,因此编译器将在必要时隐式使用该参数将Fl_Color转换为Color。这是C++构造函数的正常行为,它采用单个参数,而不使用显式关键字标记。

        4
  •  0
  •   avakar    16 年前

    Fl_Color Color ,因为 颜色 具有非显式构造函数,该构造函数 彩色 作为一个参数。