精华内容
下载资源
问答
  • 在本篇文章里小编给大家整理了关于C++隐式转换问题分析及解决办法,有需要的朋友们可以学习下。
  • 主要介绍了C++隐式类型转换运算符operator type()用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • c++ 隐式类型转换

    千次阅读 多人点赞 2018-12-25 17:14:32
    文章目录谈谈c++隐式类型转换列举一些隐式类型转换的例子有时候隐式类型转换并不好explic关键词的用法总结 谈谈c++隐式类型转换 什么是c++隐式类型转换?这是指c++自动将一种类型转换成另一种类型,是编译器的一种...

    谈谈c++隐式类型转换

    • 什么是c++隐式类型转换?这是指c++自动将一种类型转换成另一种类型,是编译器的一种自主行为。
    • 为什么c++需要隐式类型转换?
      1. c++多态的特性,就是通过父类的对象实现对子类的封装,以父类的类型返回之类对象。
      2. c++中使用父类的地方一定可以使用子类代替,这也得益于隐式类型转换。
      3. c++是一种强类型的语言,有着非常严格的类型检查,采用隐式类型转换会使程序员更方便快捷一点。
      4. 但是在享受方便的时候,风险也紧跟其后。

    列举一些隐式类型转换的例子

    int i=3;
    double j = 3.1;
    i+j;//i会被转换成double类型,然后才做加法运算。
    
    class A{};
    class B: public A
    {};//B是子类
    void Fun(A& a);
    B b;
    Fun(b);//使用子类对象代替父类对象是可以的,也是因为隐式类型转换。
    

    有时候隐式类型转换并不好

    class Test
    {
    	public:
    		Test(int i);
    };
    
    Test t1 = 1;//正确,由于强制类型转换,1先被Test构造函数构造成Test对象,然后才被赋值给t1
    Test t2(1);//正确
    
    1. 这种情况有时候很好,如果程序员的本意就是如此,那可以省去好几行代码。
    2. 有时这种情况看起来就不那么好,可能是一个错误,程序员错误的写出了这行代码,但是它却奇迹般的没有导致错误,要是因此产生一个bug,那么将是灾难性的。
    3. 为了更准确的表达程序员的自我意愿,本着不怕多写几行代码的心,就使用c++ explicit关键词
    • 再比如有函数用到Test类
    void fun(Test& t);
    fun(1);//这样调用是没有问题的,隐式类型转换会把1转换成Test的对象。
    

    explic关键词的用法

    class Test
    {
    	public:
    		explicit Test(int i);
    };
    Test t2 = 1;//编译报错
    Test t2(2);//编译没问题
    

    总结

    • 隐式类型转换,是编译器自发的行为,所以安全是第一位。所以呢,我们可以得出一条很重要的结论:
      1. 隐式类型转换是从小到大的转换。在数据类型上表现是少字节数据类型,转换成多字节数据类型,保证数据的完整性;在类上表现,从子类转换成父类,保证类对象功能的正常。
      2. 隐式类型转换往往是安全的,但是它可能产生意想不到的危险。
    • 既然有隐式类型转换,那么肯定就有强制类型转换。既然是强制的,那么我们可以猜测一下几点:
      1. 强制类型转换,往往是不安全的,这点要使用者去把握,去了解这种使用是不是安全。
        2. 强制类型转换又是强大的,只要你能保证做的转换的正确性,那么它就是好用的。
    • 强制类型转换和隐式类型转换,我们不能片面的看待他们是不是安全的。存在即合理,安不安全还是要看程序员自己在使用上是否正确,是否合理。
    展开全文
  • C++中隐式转换和显示转换

    千次阅读 2016-07-25 20:24:30
    ... 1)C++的类型转换分为两种,一种为... 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换。 1隐式转换 定义:隐式转换是系统跟据程序的需要而自动转换的。 1)C++类型(char,int,float,

    转自:http://www.cnblogs.com/joinclear/p/3850076.html


    0 前言

     1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换。

     2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换。

    1 隐式转换

    定义:隐式转换是系统跟据程序的需要而自动转换的。

    1)C++类型(char,int,float,long,double等)的隐式转换:

         算术表达式隐式转换顺序为:

         1、char - int - long - double

         2、float - double

    复制代码
    //1)算术表达式
    int m = 10;
    double n = m;//n = 10.0;隐式把m转为double类型
    
    int m = 10;
    float f = 10.0;
    double d = m + f;//n = 20.0;隐式把m和f转为double类型
    
    //2)赋值
    int *p = NULL; //NULL(0)隐式转换为int*类型的空指针值
    
    //3)函数入参
    float add(float f);  
    add(2); //2隐式转换为float类型
    
    //4)函数返回值
    double minus(int a, int b) 
    {  
        return a - b; //返回值隐式转换为double类型
    }
    复制代码

    2)C++类对象的隐式转换:

    复制代码
    void fun(CTest test); 
    
    class CTest 
    { 
    public: 
        CTest(int m = 0); 
    } 
    fun(20);//隐式转换
    复制代码
    2 显式转换

    定义:显式转换也叫强制转换,是自己主动让这个类型转换成别的类型。

    1)C++类型(char,int,float,long,double等)的显式转换:

    int m = 5;
    char c = (char)m;//显式把m转为char类型
    
    double d = 2.0;
    int i = 1;
    i += static_cast<int>(d);//显式把d转换为int类型

    2)C++类对象的显式转换:当类构造函数只有一个参数或除了第一个参数外其余参数都有默认值时,则此类有隐含的类型转换操作符(隐式转换),但有时隐式转换并不是我们想要的,可在构造函数前加上关键字explicit,来指定显式调用。

    复制代码
    void fun(CTest test); 
    
    class CTest 
    { 
    public: 
        explicit CTest(int m = 0); 
    } 
    fun(20);//error 隐式转换
    fun(static_cast<CTest>(20)); //ok 显式转换

    展开全文
  • C++中隐式转换规则

    2020-03-10 21:44:40
    C++中隐式转换规则与C基本一致 在程序隐式转换是很安全的,不需要程序员操作(不同于强制类型转换),强制类型转换比较容易出错 C中隐式转换规则: C在以下四种情况时会进行隐式转换 1.算术表达式,不同...

    C++中的隐式转换规则与C中基本一致

    在程序中的隐式转换是很安全的,不需要程序员操作(不同于强制类型转换),强制类型转换比较容易出错


    C中隐式转换规则:

    C在以下四种情况时会进行隐式转换

    • 1.算术表达式中,不同的数据类型进行计算时,要首先转换成同一种类型,才能计算(低类型的向高类型转换
    • 2.赋值表达式中,右边表达式的值隐式的转换为左边变量的类型,然后赋值给左边
    • 3.函数调用中,形实结合的过程中,实参如果和形参类型不一致时,要先转换成和形参一致,然后实参的值赋值给形参
    • 4.函数右返回值,系统隐式地将返回表达式的类型转换为返回值类型,将返回值返回给调用函数

    算术运算中的隐式转换规则

    • 1.字符类型需要先转换成成int类型(c语言中字符类型和整型之间可以通用)
    • 2.float类型需要转换成double类型
    • 3.short类型转换成int类型
      整体规则就是低类型的转换成高类型
      转换规则

    带符号和不带符号数之间的运算转换

    当表达式中含有无符号类型和有符号类型时,有符号的要先转换成无符号类型,因此,在这方面,无符号类型的运算优先级要高于有符号类型的;
    而对于浮点数来说,浮点数(float,double)实际上都是有符号数unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了

    signed int a = -30;
    unsigned int b = 10;
    cout << a + b << endl;
    // 发现结果不是-20,这是因为在a+b时,有符号的a会先自动转换成无符号类型,再和b进行运算;但是当a和立即数运算,不会发生自动类型转换,如:a+20,结果为-10
    
    展开全文
  • 1.隐式类型转换 #include &lt;iostream&gt; using namespace std; class Test { public: Test(int num){ cout &lt;&lt; __FUNCTION__ &lt;&lt; "(), num = " &lt;&...

    1.隐式类型转换

    #include <iostream>
    using namespace std;
    class Test
    {
     public:  
        Test(int num){
         cout << __FUNCTION__ << "(), num = " << num << endl;
      }
    }
    
    int main(){
     //编译器自动将整型“隐式转换”为Test类对象
     Test obj = 10;
    
    /*
    等同于:
     Test t1(10);
     Test t2 = t1;
    */
     return 0;
    }

    2.禁止隐式转换关键字:explicit

    #include <iostream>
    using namespace std;
    class Test{
    public://explicit(显式)构造函数
      //explicit Test(int n){
        cout << __FUNCTION__ << "(), n = " << n << endl;
      }
    };
    
    int main(){
      //Test t1 = 222;//编译错误,不能隐式调用其构造函数
      Test t2(12);//显式调用成功
      return 0;
    }
    

     

    展开全文
  • C++ 类型隐式转换函数

    千次阅读 2019-04-02 14:18:01
    A 的类型转换函数:A-->其他类型;A 的转换构造函数:其他类型-->A
  • c++避免隐式转换

    千次阅读 2016-01-28 11:00:40
    C++有一个很方便的功能—隐式转换,比如有一个函数 void func(double f); 调用它的时候 func(5); func(5.0); 都是有效的。 但有时候,这个功能就很麻烦了。比如: class A{ public: A(const string&...
  • 转换函数的名称是类型转换的目标类型,因此,不必再为它指定返回值类型;转换函数是被用于本类型的数值或变量转换为其他的类型,也不必带参数
  • c++中隐式转换

    2019-05-03 16:12:02
    这个时候就出现了complex c1=5的这种写法,这种写法就等于发生了一次隐式转换,即由int型隐式转换成了一个对象类型,那么是怎么发生这种转换的呢,是由于构造函数存在单个参数造成的: Complex(double r, ...
  • 在本篇文章里小编给大家整理的是一篇关于C++中隐式类型转换学习笔记内容,有兴趣的跟着小编来学习下吧。
  • 在开发遇到的一个问题,如何关闭C++函数的隐式转换 C++只提供了关闭类的隐式转换,但是想要关闭某个函数的隐式转换没有提供直接的方法,我们可以借助宏和模板的方法实现,实现如下图 代码,宏 EXPLICIT 是关闭...
  • C++自定义隐式转换函数

    千次阅读 2015-03-02 19:50:50
    C++中单参数构造函数若不声明为explict,在合适的场合可以产生隐式转换:由成员变量类型转换为类类型。 下面的代码展示如何实现反向的转换: void changeFontSize(FontHandle f, int newsize); class Font{ p
  • C++: 隐式类型转换和显式类型转换

    千次阅读 2019-11-06 12:49:44
    隐式类型转换 又称为“标准转换”,包括以下几种情况: 1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式, 最宽的数据类型成为目标转换类型。 intival=3; doubledval=3.14159; ival+dval;//ival...
  • C++ 数值类型隐式转换

    2020-05-10 12:13:26
    隐式转换规则: 1.运算符的运算对象将转换成最宽的类型 2.当表达式既有浮点类型也有整数类型时,整数值将转换成相应的浮点类型。 整型提升:bool, char, unsigned char, signed char, short --> int ->...
  • C++中算术运算的隐式转换规则

    千次阅读 2014-12-01 10:12:53
     2、赋值表达式,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。  3、函数调用参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。  4、函数有返回值时,系统将隐式地将返回表达式...
  • 很久之前团队关掉了隐式转换的warning(因此相应的treat warning as error)就也关掉了。 这个中间有着非常多的可怕的点,我觉得c++根本不应该把这个功能弄进来,都需要显式的转换; 要知道一个这样的错误需要多长...
  • 隐式转换 当一个值拷贝给另一个兼容类型的值时,隐式转换会自动进行。所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。 例如: short a=2000; int b; b=a; 在这里,a在没有任何显示操作符的...
  • 主要介绍了c++隐式类型转换的二个示例,需要的朋友可以参考下
  • c++隐式类型转换

    2019-04-15 20:08:07
    c++中的基本类型并非完全对立,部分类型之间是可以进行隐式转换的,所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为,很多时候用户都不知道具体进行了哪些转换 为什么要进行隐式转换隐式转换...
  •  今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数、拷贝构造函数、析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服!  其实我们已经在C/C++中...
  • 隐式转换问题(c++)

    2019-09-19 10:54:41
    最近遇到一个问题,time_t(__int64)类型与float类型直接相加得到的结果是错误的: time_t curTime = 1563924292; float timeOffset = 3....错误原因涉及算术运算隐式转换规则,遂查阅资料整理了相关知识。...
  • C++ explicit关键字:禁止隐式转换

    千次阅读 2018-12-18 19:17:58
    explicit关键字是用来防止由构造函数定义的隐式转换。 要明白这个关键字的含义,首先我们要知道class类型的对象的隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。 比如: ...
  • 编译器经常会背着我们做一些我们不希望发生的事情,典型的是隐式转换。不过庆幸的是,编译器只会帮助我们进行一次转换,而不会无休止的隐式转换,直至满足条件为止。例如,下面先定义一个Array模板类: template...
  • C++隐式类型转换

    2018-04-27 13:35:32
    C++隐式类型转换基本数据类型:bool,char,short,int,long,float,double,long doule其中它们的字节长度满足: (signed/unsigned)char&lt;=(unsigned)short&lt;=(unsigned)int&lt;=(unsigned)...
  • C++隐式转换和显示转换
  • C++ 隐式转换和显示转换(转)

    万次阅读 2020-07-31 13:45:03
    2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换。 1隐式转换 定义:隐式转换是系统跟据程序的需要而自动转换的。 1)C++类型(char,int,float,long,double等)的隐式转换: 算术表达式隐式转换...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,132
精华内容 25,252
关键字:

c++中的隐式转换

c++ 订阅