正在进行的返回值转换的说明

时间:2009-12-03 18:50:54

标签: c++ fltk

#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_;
};

这是Fl / Enumerations.h的重要部分的摘录

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_COLOR枚举的静态类定义,我无法理解下面类中发生的事情。我看不出Fl_Color如何知道Color类以及编译器如何知道如何将Fl_Color转换为Color。我确实意识到Color有一个隐含的转换为Fl_Color,但我并不认为转换是双向的。这是如何运作的?编译器是否只调用构造函数并将返回值作为第一个参数传递?

4 个答案:

答案 0 :(得分:3)

返回Color的静态方法都会将调用结果返回给fl_rgb_color

fl_rgb_color返回Fl_ColorColor有一个参数构造函数,该构造函数未标记为explicit,并且引用了一个const Fl_Color,所以这是有效的隐含转换。

fl_rgb_color的返回值是临时的,但由于Color通过Fl_Color引用获取const参数,因此将临时值绑定到构造函数参数是合法的。它的生命周期一直持续到Color对象(本身也是返回值的临时对象)的构造完成。

答案 1 :(得分:0)

在返回

之前隐式运行F1_color上的Color构造函数

答案 2 :(得分:0)

Color的构造函数采用Fl_Color参数,因此编译器将在必要时隐式使用它将Fl_Color转换为Color。对于采用单个参数且未使用explicit关键字标记的C ++构造函数,这是正常行为。

答案 3 :(得分:0)

Fl_Color可隐式转换为Color,因为Color具有非Fl_Color作为参数的非显式构造函数。