转换函数的特点:

(1)必须是类方法。

(2)没有返回值。

(3)没有参数。

(4)只能转换为内置类型,不可以转换为自定义类型。

#include <iostream>
using std::cout;
using std::endl;

class Stonewt
{
private:
    enum {Lbs_per_stn = 10};      // pounds per stone
    int stone;                    // whole stones
    double pds_left;              // fractional pounds
    double pounds;                // entire weight in pounds
    void Show() const{
        cout << "\t this = " << this << ", (stone, pds_left) = (" << stone << ", " << pds_left << "), pounds = " << pounds << endl;
    }
public:
    //explicit Stonewt(double lbs);          // constructor for double pounds
    Stonewt(double lbs);          // constructor for double pounds
    Stonewt(int stn, double lbs); // constructor for stone, lbs
    Stonewt();                    // default constructor
    Stonewt(const Stonewt &st);         // copy constructor
    ~Stonewt();
    Stonewt& operator=(const Stonewt &st);  // copy constructor
    operator double()const;
};

// construct Stonewt object from double value
Stonewt::Stonewt(double lbs)
{
    cout << "enter " << __func__ << "(double lbs)\n";
    stone = int (lbs) / Lbs_per_stn;    // integer division
    pds_left = int (lbs) % Lbs_per_stn + lbs - int(lbs);
    pounds = lbs;
    Show();
    cout << "leave " << __func__ << "(double lbs)\n";
}

// construct Stonewt object from stone, double values
Stonewt::Stonewt(int stn, double lbs)
{
    cout << "enter " << __func__ << "(int stn, double lbs)\n";
    stone = stn;
    pds_left = lbs;
    pounds =  stn * Lbs_per_stn +lbs;
    Show();
    cout << "leave " << __func__ << "(int stn, double lbs)\n";
}

Stonewt::Stonewt()          // default constructor, wt = 0
{
    cout << "enter " << __func__ << "()\n";
    stone = pounds = pds_left = 0;
    Show();
    cout << "leave " << __func__ << "()\n";
}

Stonewt::Stonewt(const Stonewt &st)  // copy constructor
{
    cout << "enter " << __func__ << "(const &)\n";
    stone = st.stone;
    pounds = st.pounds;
    pds_left = st.pds_left;
    Show();
    cout << "leave " << __func__ << "(const &)\n";
}

Stonewt::~Stonewt()         // destructor
{
    cout << "enter " << __func__ << "()\n";
    Show();
    cout << "leave " << __func__ << "()\n";
}

Stonewt& Stonewt::operator=(const Stonewt &st)
{
    cout << "enter " << __func__ << "(const &)\n";
    if(this == &st){
        cout << "same object\n";
        return *this;
    }
    stone = st.stone;
    pounds = st.pounds;
    pds_left = st.pds_left;
    Show();
    cout << "leave " << __func__ << "(const &)\n";
    return *this;
}

// conversion functions
Stonewt::operator double()const
{
    cout << "enter " << __func__ << "()\n";
    Show();
    cout << "leave " << __func__ << "()\n";
    return pounds; 
}

int main(){
    Stonewt obj1 = 275; // uses constructor to initialize
    obj1 = 276.8;      // uses constructor for conversion
    cout << double(obj1) << endl;
}

测试结果:

enter Stonewt(double lbs)

         this = 0x7fff20137160, (stone, pds_left) = (27, 5), pounds = 275

leave Stonewt(double lbs)

enter Stonewt(double lbs)

         this = 0x7fff20137180, (stone, pds_left) = (27, 6.8), pounds = 276.8

leave Stonewt(double lbs)

enter operator=(const &)

         this = 0x7fff20137160, (stone, pds_left) = (27, 6.8), pounds = 276.8

leave operator=(const &)

enter ~Stonewt()

         this = 0x7fff20137180, (stone, pds_left) = (27, 6.8), pounds = 276.8

leave ~Stonewt()

enter operator double()

         this = 0x7fff20137160, (stone, pds_left) = (27, 6.8), pounds = 276.8

leave operator double()

276.8

enter ~Stonewt()

         this = 0x7fff20137160, (stone, pds_left) = (27, 6.8), pounds = 276.8

leave ~Stonewt()