转换函数的特点:

(1)必须是类方法。

(2)没有返回值。

(3)没有参数。

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

#include 
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 valueStonewt::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 valuesStonewt::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 functionsStonewt::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()