C++(十六)类之间转化

简介: 在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。

类之间转化

自定义类型-转化构造函数

class 目标类
{
    目标类(const 源类型 & 源类对象引用)
    {
        根据需求完成从源类型到目标类型的转换
    }
}

目标
实现其它类型到本类类型的转化。

原理
转换构造函数,本质是一个构造函数。是只有一个参数的构造函数。如有多
个参数,只能称为构造函数,而不是转换函数。转换构造,强调的是一转一。

应用
用于传参或是作返回。

explicit 关键字

关键字 explicit 可以禁止"单参数构造函数"被用于自动类型转换。
即 explicit 仅用于单参构造(默认参数构成的单参亦算)。

转化多是刻意而为之,以隐式的形式发生,为了示意同正常构造的不同,常用
explicti 关键字修饰,要求在转化时显示的调用其构造器完成转化。

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
//转化构造函数的本质,也是构造函数
class Point2D
{
    //友元类
    friend class Point3D;
public:
    Point2D(int x=0, int y=0 )
            :_x(x),_y(y){}
private:
    int _x;
    int _y;
};

class Point3D
{
public:
    Point3D(int x=0, int y=0 ,int z=0)
            :_x(x),_y(y),_z(z){}
    //转换构造函数
    explicit Point3D(const Point2D & d2)
    {
        this->_x = d2._x;
        this->_y = d2._y;
        this->_z = rand()%100;
    }
    void dumpFormat()
    {
        cout<<"("<<_x<<","<<_y<<","<<_z<<")"<<endl;
    }
private:
    int _x;
    int _y;
    int _z;
};

void foo(Point3D d3)
{
    d3.dumpFormat();
}


int main()
{
    srand(time(NULL));
    Point2D  d2(10,100);

    Point3D  d3 =(Point3D) d2;//在这里隐式调用了转换构造函数
    //!转化多是刻意而为之,以隐式的形式发生,为了示意同正常构造的不同,常用
    //!explicti 关键字修饰,要求在转化时显示的调用其构造器完成转化。

    d3.dumpFormat();
    //foo(d2);
    foo((Point3D)d2);
    return 0;
}


```c++
#include <iostream>
using namespace std;
//关键字 explicit 可以禁止"单参数构造函数"被用于自动类型转换
class mystring
{
public:

    explicit mystring(const char* s= nullptr)
    {
        cout<<"    mystring(const char* s= nullptr)"<<endl;
    }
};
int main()
{
    mystring s("qwer"); //显示调用转换构造
    mystring s2 = "qwer"; //隐式调用转换构造,被explicit禁止
    return 0;
}


## 自定义类型-操作符函数转化
转换函数必须是类方法,转换函数无参数,无返回。

```c++
class 源类{
    operator 目标类(void)
    {
        return 目标类构造器(源类实参);
    }
}
//todo 自定义类型-操作符函数转化
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

class Point3D
{
public:
    Point3D(int x=0, int y=0 ,int z=0)
            :_x(x),_y(y),_z(z){}

    void dumpFormat()
    {
        cout<<"("<<_x<<","<<_y<<","<<_z<<")"<<endl;
    }
private:
    int _x;
    int _y;
    int _z;
};


class Point2D
{

public:
    Point2D(int x=0, int y=0 ):_x(x),_y(y){}

    //操作符函数转化
    operator Point3D (void){
        return Point3D(_x,_y,rand()%100);
    }

private:
    int _x;
    int _y;
};




void foo(Point3D d3)
{
    d3.dumpFormat();
}


int main()
{
    srand(time(NULL));
    Point2D  d2(10,100);

    Point3D  d3 = d2;
    d3.dumpFormat();
    return 0;
}
相关文章
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
31 0
|
12天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
12天前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
1月前
|
存储 安全 编译器
【C++】类和对象(下)
【C++】类和对象(下)
【C++】类和对象(下)
|
25天前
|
存储 算法 编译器
c++--类(上)
c++--类(上)
|
1月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
1月前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
|
1月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
1月前
|
编译器 C++
【C++】类和对象(中)
【C++】类和对象(中)
|
1月前
|
存储 编译器 程序员
【C++】类和对象(上)
【C++】类和对象(上)