0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++之类型转换函数详解

电子设计 来源:电子设计 作者:电子设计 2020-12-24 15:31 928次阅读

一、转换构造函数的学习:

1、回忆数据类型转换:

在平时写代码的时候,最怕的就是那种隐式数据类型转换了,一不小心,软件就bug不断;而显示数据类型(一般是程序自己去强制类型转换,这个是我们能够明显的识别和掌控的)。为此我们这里总结了一副隐式类型转换的图:

下面我们来几个隐式转换的例子:

代码版本一:

#include <iostream>
#include <string>
int main()

short s ='a';
unsigned int ui = 100;
int i = -200;
double d = i;
std::cout<<"d =" << d <<std::endl;
std::cout<<"ui= "<<ui<<std::endl;
if((ui+i)>0)

std::cout<<"Postive"<<std::endl;

else

std::cout<<"Negative"<<std::endl;

return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
d =-200
ui= 100
Postive

注解:这里我们明显发现(-200+100)还是大于0,这显然不符合正常人的思维了;所以我们仔细分析一下,发现这里肯定是进行了隐式转换了,为此我们再加一条语句看看(ui+i)的值到底是多少:

代码版本二:

#include <iostream>
#include <string>
int main()

short s ='a';
unsigned int ui = 100;
int i = -200;
double d = i;
std::cout<<"d =" << d <<std::endl;
std::cout<<"ui= "<<ui<<std::endl;
if((ui+i)>0)

std::cout<<"(ui+i) = "<<ui+i<<std::endl;
std::cout<<"Postive"<<std::endl;

else

std::cout<<"Negative"<<std::endl;

return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
d =-200
ui= 100
(ui+i) = 4294967196
Postive

注解:通过打印(ui+i)的值我们发现,i原本是int数据类型,这里隐式转换成无符号的数据类型了

为了让大家更加理解隐式的转换,我们下面再来一个例子:

代码版本三:

#include <iostream>
#include <string>
int main()

short s ='a';
unsigned int ui = 100;
int i = -200;
double d = i;
std::cout<<"d =" << d <<std::endl;
std::cout<<"ui= "<<ui<<std::endl;
if((ui+i)>0)

std::cout<<"(ui+i) = "<<ui+i<<std::endl;
std::cout<<"Postive"<<std::endl;

else

std::cout<<"Negative"<<std::endl;

std::cout<<"sizeof(s+'b') = "<<sizeof(s+'b')<<std::endl;
return 0;

输出结果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
d =-200
ui= 100
(ui+i) = 4294967196
Postive
sizeof(s+'b') = 4

注解:这里我们发现sizeof出来的内存大小是4个字节大小;其实这里编译器把short和char类型的都转换int类型了,所以最终两个int数据相加,所占的内存大小就是int类型了。

所以咋们平时在写代码的时候,脑袋里面要有这种写代码谨慎的思维,防止出现这种隐式转换的情况出现,养成写代码的好习惯

2、普通类型与类类型之间能否进行类型转换,类类型之间又是否能够类型转换呢?

为了说明这些问题,咋们通过实际的代码测试来看看啥情况:

代码:普通类型转换成类类型

#include <iostream>
#include <string>
class Test{
public:
Test()


Test(int i)


};
int main()

Test t;
t =6; 从 C 语言角度,这里将 5 强制类型转换到 Test 类型,只不过编译器 在这里做了隐式类型转换
return 0;

输出结果(显示可以编译通过)

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out

代码类类型转换为普通类型

#include <iostream>
#include <string>
class Test{
public:
Test()


Test(int i)


};
int main()

Test t;
int i = t;
return 0;

输出结果(没有编译通过)

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:21:14: error: cannot convert ‘Test’ to ‘int’ in initialization
int i = t;

代码类类型与类类型之间的转换:

#include <iostream>
#include <string>
class Value{
};
class Test{
public:
Test()


Test(int i)


};
int main()

Test t;
Value i;
t=i;
return 0;

输出结果(暂时还是不行,编译不通过):

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:27:7: error: no match for ‘operator=’ (operand types are ‘Test’ and ‘Value’)
t=i;

test.cpp:27:7: note: candidate is:
test.cpp:9:7: note: Test& Test::operator=(const Test&)
class Test{

test.cpp:9:7: note: no known conversion for argument 1 from ‘Value’ to ‘const Test&’

说明:上面的例子,我们只是简单的按照实际角度出发,发现确实有写转换行不通。那么真理到底是怎样的?我们接着往下看

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    517

    浏览量

    44374
  • C++
    C++
    +关注

    关注

    22

    文章

    2116

    浏览量

    74335
收藏 人收藏

    相关推荐

    西门子TIA Portal中函数FC和函数块FB的相互转换

    描述 本文将介绍在西门子 TIA Portal 中使用 Add-In 插件实现函数 FC 和函数块 FB 的相互转换的方法和步骤。 第1步: 添加 PLC 设备。 选择西门子 CPU 1214
    的头像 发表于 01-15 10:07 1067次阅读
    西门子TIA Portal中<b class='flag-5'>函数</b>FC和<b class='flag-5'>函数</b>块FB的相互<b class='flag-5'>转换</b>

    Spire.XLS for C++组件说明

    开发人员可以快速地在 C++ 平台上完成对 Excel 的各种编程操作,如根据模板创建新的 Excel 文档,编辑现有 Excel 文档,以及对 Excel 文档进行转换。 Spire.XLS
    的头像 发表于 01-14 09:40 360次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    同样是函数,在CC++中有什么区别

    同样是函数,在 CC++ 中有什么区别? 第一个返回值。 C语言的函数可以不写返回值类型
    的头像 发表于 11-29 10:25 627次阅读

    ADS1299EEGFE-PDK在window上如何通过C++读取8通道数据?

    入手了一块ADS1299EEGFE-PDK,想用这块板做eeg测试,开发语言是c++,window平台,这块板没有提供sdk之类的,怎么获取8个通道的数据,有没有做过的朋友?
    发表于 11-27 06:51

    C++新手容易犯的十个编程错误

    简单的总结一下 C++ 新手容易犯的一些编程错误,给新人们提供一个参考。 1 有些关键字在 cpp 文件中多写了 对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再加上了,比如
    的头像 发表于 11-15 12:42 696次阅读

    C语言和C++中结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 523次阅读

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近开发的使用习惯与推理方式。与OpenCV的Mat对象对接方式更是几乎无缝对接,非常的方便好用。
    的头像 发表于 07-26 09:20 1259次阅读

    c++编译后链接失败的原因?如何解决?

    /c++项目,将刚才新建的项目转换c++项目。 完成后点击编译,此时也是正常的。 新建一个cpp文件,将原项目的main.c中内容全部拷贝到新建的cpp文件中保存,然后删除原main
    发表于 07-25 08:13

    ModusToolbox 3.2在c代码中包含c++代码的正确步骤是什么?

    使用 ModusToolbox 3.2 我有一个用纯 C 语言编写的 XMC4700 项目。 我正在尝试添加一些 C++ 函数,并将其合并到我的原始代码中。 我可以构建独立的 .cpp/.hpp
    发表于 07-23 08:21

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 8次下载

    C++中实现类似instanceof的方法

    函数,可实际上C++中没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java中的instanceof的功能。 在 C++ 中,确定对象的
    的头像 发表于 07-18 10:16 770次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

    OpenCV图像识别C++代码

    的头文件 在您的C++代码中,包含以下必要的头文件: # include # include # include # include # include # include # include 读取图像
    的头像 发表于 07-16 10:42 3088次阅读

    FX2 CY7C68013A如何在C++环境中使用LoadEEPROM函数

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 库中有我需要的 LoadEEPROM 函数。 请问如何在 C++ 环境而不是 C#/CLR 环境中使用该
    发表于 05-31 06:59

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平
    的头像 发表于 04-14 11:43 3012次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】