标签:c++
转换函数的特点:
(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()
本文出自 “用C++写诗” 博客,谢绝转载!
标签:c++
原文地址:http://frankniefaquan.blog.51cto.com/12613979/1934950