100.类型转换以及类类型转换

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <iostream>
  3 using namespace std;
  4
  5 class myclass
  6 {
  7 public:
  8     int x;
  9     int y;
 10
 11     myclass()
 12     {
 13
 14     }
 15     //赋值初始化
 16     //加上explicit表示不能调用隐式的转换
 17     explicit myclass(int a) :x(a), y(a)
 18     {
 19         cout << "构造" << endl;
 20     }
 21
 22     //赋值重载
 23     void operator =(int num)
 24     {
 25         cout << "赋值重载";
 26         this->x = 3;
 27     }
 28
 29     //类类型转换为int 不能有参数
 30     //类类型转换只能是成员函数,必须有this指针
 31     operator int()
 32     {
 33         return (x + y);
 34     }
 35
 36     operator double();
 37 };
 38
 39 myclass::operator double()
 40 {
 41     return x + y;
 42 }
 43
 44 //CPP编译的是从上到下,会遇到不匹配问题
 45 //类的声明可以拓展作用域,但是只能创建指针或者引用,不能创建对象
 46 //完成类类型转换的时候,一般两个类的转换,两个转换接口都放在一个类
 47
 48 class mypoint2
 49 {
 50 public:
 51     int a;
 52     int b;
 53
 54 public:
 55     mypoint2(int x, int y) :a(x), b(y)
 56     {
 57
 58     }
 59
 60     mypoint2() :a(0), b(0)
 61     {
 62
 63     }
 64 };
 65
 66 //该类提供了两个接口,把mypoint转换为mypoint2 mypoint2转换为mypoint1
 67 class mypoint
 68 {
 69 public:
 70     int x;
 71     int y;
 72     int z;
 73     mypoint() :x(10), y(20), z(20)
 74     {
 75
 76     }
 77
 78     //mypoint2类型转换为mypoint类型
 79     mypoint(const mypoint2 &my):x(my.a),y(my.b),z(0)
 80     {
 81
 82     }
 83
 84     //mypoint类型转化为mypoint2类型
 85     operator mypoint2()
 86     {
 87         mypoint2 temp(x, y);
 88         return temp;
 89     }
 90
 91     //重载等于号
 92     void operator=(const mypoint2 &my)
 93     {
 94         x = my.a;
 95         y = my.b;
 96         z = 0;
 97     }
 98 };
 99
100 void main()
101 {
102     //c++的转换
103     ////自动转换
104     //int a = 1.2;
105     ////显式转换
106     //int b = static_cast<int>(2.3);
107     ////C风格
108     //int c = (int)2.5;
109
110     //int *p1 = nullptr;
111     ////CPP风格的指针转换
112     //char *p2 = reinterpret_cast<char *>(p1);
113
114     //构造函数初始化,视作类型转换
115     /*myclass my1 = static_cast<myclass>(5);
116     myclass my2(2);
117     myclass my3 = myclass(5);
118     myclass my4 = (myclass)5;
119     myclass my5;
120     my5 = 3;*/
121
122     //调用类类型转换为int类型
123     //myclass my1;
124     //my1.x = 4;
125     //my1.y = 3;
126     //int a = my1;
127     //cout << a << endl;
128
129     mypoint2 my1(1, 2);
130     mypoint my2(my1);
131     //mypoint my3 = my1;
132
133     //调用operator mypoint2() 进行类型转换
134     mypoint2 my4= my2;
135
136     cin.get();
137 }

类类型转换在实际开发中的用途

 1 #include "mainwindow.h"
 2 #include <QApplication>
 3 #include <QDebug>
 4
 5 class winsize
 6 {
 7 public:
 8     int x;
 9     int y;
10 };
11
12 class mywin
13 {
14 public:
15     MainWindow *p;
16     int cx;
17     int cy;
18
19 public:
20     mywin():cx(0),cy(0),p(nullptr)
21     {
22
23     }
24
25     //mywin到winsize的类型转换
26     mywin(const winsize &mysize):cx(mysize.x),cy(mysize.y)
27     {
28         p=new MainWindow;
29         p->resize(cx,cy);
30         p->show();;
31     }
32
33     //winsize到mywin的类型转换
34     operator winsize()
35     {
36         winsize tmp{cx,cy};
37         return tmp;
38     }
39
40     void operator = (const winsize &mysize)
41     {
42         if(p!=nullptr)
43         {
44             p->resize(cx,cy);
45             p->show;
46         }
47         else
48         {
49             p = new MainWindow;
50             p->resize(cx,cy);
51             p->show();
52         }
53     }
54
55 };
56
57 int main(int argc, char *argv[])
58 {
59     QApplication a(argc, argv);
60     winsize win1{200,600};
61     mywin my = win1;
62
63     //winsize win2 = my;
64     //上述语句的本质
65     winsize win2 = my.operator winsize();
66
67     qDebug()<<win2.x << win2.y;
68     return a.exec();
69 }

原文地址:https://www.cnblogs.com/xiaochi/p/8600733.html

时间: 2024-09-29 16:12:44

100.类型转换以及类类型转换的相关文章

隐式类类型转换

<C++ Primer>中提到: “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换.” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的. 那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换. 下面通过代码来看一看: #include "stdafx.h" #include <string>

隐式的类类型转换

如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数. 能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则. 例如,在Sales_data类中,接受string的构造函数和接受istream的构造函数分别定义了从这两种类型向Sales_data隐式转换的规则.也就是说,在需要使用Sales_data的地方,我们可以使用string或者istream作为替代: 构造函数:Sales_data(const st

自动类型转换、强制类型转换、作用域、整型表数范围

一.变量的作用域 测试代码: public class Test1 { private static int value = 1; // 全局变量 private static int temp = 0; // 全局变量 public static void main(String[] args) { int value = 2; // 局域变量覆盖全局变量 System.out.println(value); // 输出的是局域变量,全局变量被屏蔽 System.out.println(tem

数据类型转换之自动类型转换

当数据类型不一样时,将会发生数据类型转换. 自动类型转换(隐式) 1. 特点:代码不需要进行特殊处理,自动完成. 2. 规则:数据范围从小到大. 强制类型转换(显式) 一.自动类型转换代码 1 public class Demo01DataType { 2 public static void main(String[] args) { 3 System.out.println(1024); // 这就是一个整数,默认就是int类型 4 System.out.println(3.14); //

最最常用的 100 个 Java 类(转)

大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个项目中只计数一次,下面的列表中显示前 100 名的类. 以下列表中按使用最多的类进行排序,第三个数值表示 10000 个项目里使用到该类的项目数,而完整的列表请看 here. java.util.ArrayList(6958) java.io.IOException(6866) java.util.

最常用的 100 个 Java 类

大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个项目中只计数一次,下面的列表中显示前 100 名的类. 以下列表中按使用最多的类进行排序,第三个数值表示 10000 个项目里使用到该类的项目数,而完整的列表请看 here. java.util.ArrayList(6958) java.io.IOException(6866) java.util.

类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类

 常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式. 案例: #include <iostream> class fushu { public: //通过加explicit的这种方式避免隐式转换,避免引发歧义 explicit fushu(int num) { x = num; y = num; } void print() { std::cou

C++ 类类型转换函数explicit 关键字

标准数据之间会进行  隐式类型安全转换. 转换规则: 隐式类型转换的问题: #include <iostream> #include <string> using namespace std; int main() { short s = 'a'; unsigned int ui = 1000; int i = -2000; double d = i; cout <<"d = "<<d<<endl;//输出d = -2000

C++隐式类类型转换

C++可以定义如何将其他类型的对象隐式转换为我们的类类型或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构造函数. 说明:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 下面先看一个例子:http://blog.csdn.net/vagrxie/article/details/1586340 1 #include <string> 2 #include <iostream> 3 using namespace std;