类的转换函数

转换函数的特点:

(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()

时间: 2024-11-16 20:03:22

类的转换函数的相关文章

【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

类型转换函数与构造转换函数 #include<iostream> class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; y = num; } void print() { std::cout << x << "+" << y << "i" << std::endl; } operator int(); //不支

C++类转换构造函数和转换函数复习

//C++类转换构造函数和转换函数复习 #include<iostream> #include<string> using namespace std; class Student { private: string name; int age; double grade; public: Student(string name_, int age_, double grade_):name(name_), age(age_), grade(grade_){} Student(){

21.C++- ++操作符重载、隐式转换之explicit关键字、类的类型转换函数

++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 前置++操作符的返回值为*this 后置++操作符的返回值为临时对象 例如: 转换规则如下所示: 比如: 隐式转换的隐患 隐式转换有时会因为类型不同,得到的结果大有不同,也是常见bug之一. 参考以下示例: 运行打印: 答案并非是-1000. 同样,我们使用构造函数时,也经常使用隐式转换 参考以下示

4 C++基础4 类 const函数 转全局函数 返回*this 数组类。友元 函数 类 操作符重载

1,请问类中函数 const修饰的谁? [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> using namespace std; class A { public: //const的三种写法 //const void fun(int a,int b) //void const fun(int a,int b) //void fun(int a,int b) const vo

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

类的成员函数实现线程的回调函数

一般都是用静态函数作为线程的回调函数实现,但是总是感觉不是很顺畅,更改吧,就好像破坏了类的封装性,不改吧,访问实在是麻烦.所以,今天要做的就是让类的成员函数作为线程的回调函数存在,其中使用的一个比较特殊的结构就是 union { void ( *ThreadProc)(LPVOID pvParam); void ( student::*MemberProc)(LPVOID pvParam); } Proc; 联合类,用于转换类成员方法指针到普通函数指针 下面是一个小李子,变量名 就凑活看吧,核心

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

Delphi版的Base64转换函数(修改版)

Delphi版的Base64转换函数(修改版) 重新组织编写Delphi的MD2.MD4.MD5类

在类的成员函数中调用delete this

在类的成员函数中能不能调用delete this?答案是肯定的,能调用,而且很多老一点的库都有这种代码.假设这个成员函数名字叫release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法么?答案仍然是肯定 的,调用release之后还能调用其他的方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数.说到这里,相信大家都能明白为什么会这样 了. 根本原因在于delete操作符的功能和类对象的