C++ 类之间转化 转化构造函数

avatar
作者
筋斗云
阅读量:0

C++ 类之间转化 转化构造函数

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

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; }  

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!