广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++隐式类型转换存在的问题解析
  • 710
分享到

c++隐式类型转换存在的问题解析

2024-04-02 19:04:59 710人浏览 薄情痞子
摘要

目录什么是隐式转换:为什么要进行隐式转换:隐式转换的原则:目标代码构造函数定义的隐式类型转换分析a1分析a2分析a3什么是隐式转换: c++中的基本类型并非完全对立,部分类型之间是可

什么是隐式转换:

c++中的基本类型并非完全对立,部分类型之间是可以进行隐式转换的,所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为,很多时候用户都不知道具体进行了哪些转换

为什么要进行隐式转换:

隐式转换可以让程序员在两个不同类型的数据直接进行操作,而不用自行转换类型,隐式转换给程序开发者带来了不小的便捷

隐式转换的原则:

  • 基本数据类型的转换以取值范围作为转换基础(保证精度不丢失)
  • 隐式转换发生在从小 ——> 大的转换中。如char转换为int,int转换成double

目标代码

旨在弄懂下面的代码,明确变量a1,a2,a3在创建时编译器究竟干了那些事:

#include<iOStream>
using namespace std;
class A{
public:
    int x;
    A() {cout<<"A()"<<endl;}
    A(int i) : x(i){cout<<"A(int i)"<<endl;}
    A(const A &ra) : x(ra.x) 
    	{cout<<"A(const A&)"<<endl;}
    void operator=(const A&){cout<<"operator="<<endl;}
};
int main(){
    cout<<"the assignment of a1 : "<<endl;
    A a1;
    a1 = 2;
    cout<<"the copy initialization of a2 : "<<endl;
    A a2 = 2;
    cout<<"the direct initialization of a3 :"<<endl;
    A a3(a1);
    return 0;
}

运行结果:

构造函数定义的隐式类型转换

任何只接受一个参数的构造函数,都隐式地定义了由该参数向该类型的隐式类型转换

A(int i)定义了一个由int向A的隐式类型转换

所以,在任何使用A对象的地方,可以用一个int代替,此时,int会转换为一个A类型临时变量

如对a1变量的赋值操作:

A a1;   //声明a1,a1被默认初始化
a1 = 2; //2转换为A类型的临时变量,对a1进行赋值操作

对于隐式类型转换,需要注意两点:

隐式类型转换只允许一步转换

class B{
public:
    string B_s;
    B() = default;
    B(string s) : B_s(s){};
};
int main(){
    B b1,b2;
    //错误:char*->string->B,进行了两步转换
    b1 = "hello"; 
    b2 = string("hello");
    return 0;
}

接受隐式类型转换得到的对象的函数,参数传递方式必须是const引用传递

因为c++中,一般不修改临时对象,所以临时对象只能传递给const引用。

分析a1

A a1:

a1进行默认初始化,调用默认构造函数A()

a1 = 2

  • 字面量2隐式转换为A类型的临时对象
  • 该临时对象通过拷贝运算符operator=拷贝给a1
  • 因为是临时对象,所以operator=必须接受const引用,否则造成编译错误

分析a2

A a2 = 2

  • 字面量2隐式转换为A类型的临时对象
  • 用临时对象来拷贝初始化a2,调用拷贝构造函数A(const A&),相当于A a2(A(2))
  • 因为是临时对象,所以拷贝构造函数A(const A&)必须接受const引用,否则造成编译错误

特别注意

编译器会将A a2(A(2))优化A a2(2)

所以程序输出“A(int i)”,而不是“A(const A&)”

但是底层仍然调用了A(const A&),所以如果把A(const A&)改为A(A&),会造成编译错误 error: cannot bind non-const lvalue reference of type 'A&' to an rvalue of type 'A'

这提示我们,在编写c++程序时,如果不改变对象的值,那么习惯性地采用const引用会避免许多难解的编译错误

分析a3

用a1直接初始化a3,调用A(const A&)

到此这篇关于c++隐式类型转换存在的陷阱的文章就介绍到这了,更多相关c++隐式类型转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: c++隐式类型转换存在的问题解析

本文链接: https://www.lsjlt.com/news/140811.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++隐式类型转换存在的问题解析
    目录什么是隐式转换:为什么要进行隐式转换:隐式转换的原则:目标代码构造函数定义的隐式类型转换分析a1分析a2分析a3什么是隐式转换: c++中的基本类型并非完全对立,部分类型之间是可...
    99+
    2022-11-13
  • C语言基础隐式类型转换与强制类型转换示例解析
    目录类型转换隐式类型转换强制类型转换类型转换 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换包括隐式类型转换和强制类型转换。 类型转换的原则:占用内...
    99+
    2022-11-12
  • mysql存在哪些隐式类型转换
    mysql存在的隐式类型转换有字符串到数值类型、日期和时间类型、浮点数和整数类型、NULL值等。详细介绍:1、字符串到数值类型的隐式类型转换,当一个字符串和一个数值类型的值进行比较或计算时,MySQL会将字符串转换为数值类型;2、日期和时间...
    99+
    2023-11-14
    mysql 隐式类型转换
  • 详解隐秘的 MySQL 类型转换问题详解
    目录1、问题开篇1、字符串类型查询2、数值型查询2、问题引申3、跟进探究3.1 什么是隐式类型转换?3.2 如何避免隐式类型转换?3.2.1 清楚转换规则3.2.2 使用内置函数显示转换3.2.3 类型保持一致3.3 字...
    99+
    2022-10-14
  • 详解隐秘的 MySQL 类型转换问题详解
    目录1、问题开篇1、字符串类型查询2、数值型查询2、问题引申3、跟进探究3.1 什么是隐式类型转换?3.2 如何避免隐式类型转换?3.2.1 清楚转换规则3.2.2 使用内置函数显示...
    99+
    2022-11-13
    MySQL 类型转换 MySQL 类型
  • SQL Server 中的数据类型隐式转换问题
    写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类。这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题。我们先构造测试数据,如下所示: CRE...
    99+
    2022-10-18
  • 浅析JavaScript中的隐式类型转换
    目录为什么会出现隐式类型转换隐式类型转换的内部转换机制何时会触发ToPrimitive或ToNumber具体案例分析总结为什么会出现隐式类型转换 这个问题的本质原因是因为JavaSc...
    99+
    2023-03-08
    JavaScript隐式类型转换 JavaScript隐式类型
  • 详解C#如何实现隐式类型转换
    目录预期效果static using 与 global using隐式类型转换实现 Result 类型Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNe...
    99+
    2023-01-05
    C#实现隐式类型转换 C#隐式类型转换 C# 类型转换
  • C语言隐式类型转换与强制类型转换的方法是什么
    本篇内容主要讲解“C语言隐式类型转换与强制类型转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言隐式类型转换与强制类型转换的方法是什么”吧!类型转换数据有不同的类型,不同类型数...
    99+
    2023-06-25
  • c++类的隐式转换与强制转换重载详解
    在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:(1)寻找和使用最符合函数名和参数类型(包括返回值)的函数,若找到则调用;(2)否则,寻找一个函数模...
    99+
    2022-11-15
    隐式转换 强制转换 c++
  • JavaScript中类型的强制转换与隐式转换详解
    目录一、隐式转换双等号里的转换 Boolean 类型转换 "+" 与 "-" 二、强制类型转换 new String 与 ' ' 总结一、隐式转换 以下语句的执行结果是什么? A...
    99+
    2022-11-12
  • C#中常见的数据类型转换问题及解决方案
    C#中常见的数据类型转换问题及解决方案在C#中,数据类型转换是一个常见的问题。由于C#是一种强类型语言,要求变量在进行计算或赋值时类型必须匹配。因此,当我们需要将一个数据类型转换为另一个数据类型时,可能会遇到各种问题。本文将介绍常见的数据类...
    99+
    2023-10-22
    数据类型转换解决方案
  • C++中常见的数据类型转换问题及解决方法
    C++ 中常见的数据类型转换问题及解决方法引言:在 C++ 编程中,经常会遇到不同数据类型之间的转换问题。正确地进行数据类型转换是保证程序正确性和性能的关键之一。本文将介绍一些常见的数据类型转换问题,并提供相应的解决方法和具体的代码示例。一...
    99+
    2023-10-22
    解决方法 数据类型转换 C++问题
  • MySQL隐式类型转换导致索引失效的解决
    目录问题 复现 隐式转换 总结 参考 问题 在工作中发现,有一个接口只执行一条SQL查询语句,并且SQL明明使用了主键列,但是速度很慢。 在MySQL中EXPLAINN后发现,执行...
    99+
    2022-11-12
  • 直观详细的typescript隐式类型转换图文详解
    正文 1、unknown是所有类型的父类型,其他类型都可以赋值给 unknown let a: undefined = undefined; let b: null = null;...
    99+
    2022-11-13
  • 如何分析Nullable<T>的类型转换问题
    这篇文章跟大家分析一下“如何分析Nullable<T>的类型转换问题”。内容详细易懂,对“如何分析Nullable<T>的类型转换问题”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。...
    99+
    2023-06-17
  • SQL Server 2008处理隐式数据类型转换的示例分析
    小编给大家分享一下SQL Server 2008处理隐式数据类型转换的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2022-10-18
  • numpy强制类型转换的问题怎么解决
    本篇内容主要讲解“numpy强制类型转换的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“numpy强制类型转换的问题怎么解决”吧!numpy强制类型转换今天用numpy遇到一个关于类...
    99+
    2023-06-30
  • MySQL索引失效后隐式转换的问题这么解决
    MySQL索引失效后隐式转换的问题这么解决,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常见索引失效: 条件索引字段"不干净":函数操作、运算操作 隐式...
    99+
    2023-06-26
  • 关于泛型擦除问题的解决--Mybatis查询类型转换
    目录概念介绍问题案例原因分析解决方案总结概念介绍 Java语言的泛型采用的是擦除法实现的伪泛型,泛型信息(类型变量、参数化类型)编译之后通通被除掉了。使用擦除法的好处就是实现简单、非...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作