本篇主要介绍C++ 中支持自定义类型转换的构造函数。

目标类::目标类(const 源类 &源类对象) {
	//自定义规则进行复制
	//可以使用初始化列表的方式
}
  • 实现从源类到目标类之间的隐式类型转换。

  • 使用explicit关键字修饰的构造函数,表示这个构造函数只能用于显式类型转换,防止潜在的错误。

/*
    支持自定义类型转换的构造函数userDefined.cpp
*/
#include <iostream>

using namespace std;

//声明Point2d
class Point2d;

class Point3d {
private:
    int m_x;
    int m_y;
    int m_z;
public:
    //explicit告诉编译器当前构造函数不支持自定义类型转换,也就是不能发生隐式类型转换,只能发生显式类型转换
    explicit Point3d(int x,int y,int z):m_x(x),m_y(y),m_z(z){}
    void show(void) {
        cout << "三维坐标(" << m_x << ',' << m_y << ',' << m_z << ')' << endl;
    }
    //提供一个支持自定义类型转换的构造函数
    Point3d(const Point2d &pt2);//:m_x(pt2.m_x),m_y(pt2.m_y),m_z(0){}
};

class Point2d {
private:
    int m_x;
    int m_y;
public:
    Point2d(int x,int y):m_x(x),m_y(y){}
    void show(void) {
        cout << "二维坐标(" << m_x << ',' << m_y << ')' << endl;
    }
    //声明Point3d类为当前类的友元
    friend class Point3d;
};

Point3d::Point3d(const Point2d &pt2):m_x(pt2.m_x),m_y(pt2.m_y),m_z(0){}

int main(void) {
    Point3d pt3(10,20,30);
    pt3.show();
    Point2d pt2(100,200);
    pt2.show();
    pt3 = pt2;
    pt3.show();
    pt3 = static_cast<Point3d>(100);
    pt3.show();
    return 0;
}