C++不同类型转换

news/2024/10/31 5:29:43/

内置类型的转换:

        内置类型之间的转换之前提过。相同类型的赋值直接进行,但不同类型之间的赋值系统会将将其转换成临时变量,这个临时变量具有常性,然后再将这个临时变量进行赋值,这里就不做代码演示了。自定义类型转换为内置类型暂时先不做考虑,后面深入文章会进行深入讲解。

        这里要说明的是这里也不是什么内置类型都可以进行转换,当两个不同类型之间相似度较小时可以发生,当相差较大时就可能会报错。如:double与int之间相似度较大,可以发生;int与int*相似度就较小,可能会报错。如下:

int* ptr = nullptr;
int a = ptr;//出错

double d = 1.2;

int x = d;//转换成功

自定义类型的转换:

        自定义类型的隐式转换其实发生在构造函数中,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

        自定义类型与自定义类型之间相当于直接赋值运算,内置类型直接赋值自定义类型之间会发生隐式转换,即内置类型对象隐式转换成自定义类型对象。其中能支持这个转换,是因为有自定义类型的int单参数构造函数(支持传一个参数多参数带缺省也可以)支持。

        当发生一个参数多参数带缺省的情况时,隐式转换默认自定义类型成员的第一个参数进行转换。我们也可多个内置类型赋值转换。这些转换其实跟调用构造函数的效果相同。

        当内置类型向自定义类型中的内置类型发生转换时,会根据内置类型转内置类型的原则进行。

代码演练一:(单参构造函数)

#include <iostream>
using namespace std;
class A
{
public:A(int a):_a(a){	}void Print() {cout << _a << endl;}
private:int _a;
};
int main()
{A x1 = 5;//隐式类型转换为自定义类型对象x1.Print();//输出5
}

代码演练二:(多参数带缺省)

#include <iostream>
using namespace std;
class Date
{
public:Date(int year = 2023, int month = 10, int day = 16): _year(year), _month(month), _day(day){	}void Print() {cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{//单个隐式转换Date d1 = 5;//Date d1(5)的效果与之一样//多个隐式转换Date d2 = { 1,2,3 };//Date d2(1,2,3)的效果与之一样//括号表达式的运用Date d3 = (1, 2, 3);//等价于 Date d2 = 3;d1.Print();//输出5/10/16,属于单个隐式转换d2.Print();//输出1/2/3,属于多个隐式转换d3.Print();return 0;
}

explicit关键字:

        explicit关键字可以防止自定义类型中构造函数的隐式类型转换。因为自定义类型的隐式转换发生在构造函数中,所以只需用 explicit 修饰构造函数防止这种转换。

class Date
{
public:
    explicit Date(int year = 2023, int month = 10, int day = 16)
        : _year(year)
        , _month(month)
        , _day(day)
    {    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    //有了关键字explicit,下面的转换都不能实现
    //Date d1 = 5;
    //Date d2 = { 1,2,3 };
    //Date d3 = (1, 2, 3);

    Date d1(5);//类似于此种的方式没有设计隐式类型的转换,可以使用
    return 0;
}

强制类型转换:

        强制类型转换的效果比较强,explicit关键字限制不了强制类型转换。这里要说明的是强制类型转换必须跟一个表达式,因此,强制类型转换只能完成一个参数的转换。

#include <iostream>
using namespace std;
class Date
{
public:explicit Date(int year = 2023, int month = 10, int day = 16): _year(year), _month(month), _day(day){	}void Print() {cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{//强制类型转换Date d1 = (Date)5;Date d2 = (Date)(1, 2, 3);//Date d3 = (Date){1,2,3}表达错误,{1,2,3}不是一个表达式d1.Print();//输出5/10/16d2.Print();//输出3/10/16return 0;
}

http://www.ppmy.cn/news/1228953.html

相关文章

【C#】字符串拼接相关

目录 1.字符串拼接方式1 用号进行字符串拼接 复合运算符 2.字符串拼接方式2 3.控制台打印拼 4.例子 1.字符串拼接方式1 之前的算数运算符 只是用来数值类型变量进行数学运算的而 string 不存在算数运算符 不能计算 但是可以通过号来进行字符串拼接 用号进行字符串拼接 …

不想花大价钱?这10款替代Axure的平替软件更划算!

Axure是许多产品经理和设计师进入快速原型设计的首选工具&#xff0c;但Axure的使用成本相对较高&#xff0c;学习曲线陡峭&#xff0c;许多设计师正在寻找可以取代Axure的原型设计工具&#xff0c;虽然现在有很多可选的设计工具&#xff0c;但质量不均匀&#xff0c;可以取代A…

1.1二分查找

二分查找&#xff0c;主要是针对基本有序的数据来进行查找target。 二分法的思想很简单&#xff0c;因为整个数组是有序的&#xff0c;数组默认是递增的。 1.1 使用条件 用于查找的内容逻辑上来说是需要有序的查找的数量只能是一个&#xff0c;而不是多个 1.2 简介 首先选…

详解使用asyncio实现playwright并发操作(复制源码即可运行)

asyncio实现并发 我们可以使用asyncio来解决palywright中并发的问题&#xff0c;asyncio即Asynchronous I/O是python一个用来处理并发(concurrent)事件的包&#xff0c;是很多python异步架构的基础&#xff0c;多用于处理高并发网络请求方面的问题。给大家举一个经典的应用场景…

C#入门(6): 结构体、ref struct

文章目录 定义结构体实例化结构体结构体的值类型特性结构体和类的区别限制ref structref return C# 中的结构体&#xff08;Struct&#xff09;是一种值类型数据结构&#xff0c;用于封装不同或相同类型的数据成一个单一的实体。结构体非常适合用来表示轻量级的对象&#xff0c…

(八)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (检索 Retrieval)

检索增强生成&#xff08;RAG&#xff09;的整体工作流程如下&#xff1a; 在构建检索增强生成 (RAG) 系统时&#xff0c;信息检索是核心环节。检索是指根据用户的问题去向量数据库中搜索与问题相关的文档内容&#xff0c;当我们访问和查询向量数据库时可能会运用到如下几种技术…

通过汇编理解cortex-m3:第0章

第0章&#xff1a;准备工作 基本想法&#xff1a;利用汇编和gdb调试&#xff0c;来学习cortex-m3汇编指令&#xff0c;以及一些寄存器的功能。 软件和硬件&#xff1a; 硬件&#xff1a;韦东山瑞士军刀中的最小核心板&#xff08;STM32F103C8T6&#xff09; STLINK-V2&#…

每日一题 53. 最大子数组和(中等,数组)

很经典的数组题了 class Solution:def maxSubArray(self, nums: List[int]) -> int:ans -inft 0for i in nums:t ians max(ans, t)if t < 0:t 0return ans