精华内容
下载资源
问答
  • 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++隐式类型转换

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

    什么是隐式转换:

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

    为什么要进行隐式转换:

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

    隐式转换的原则:

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

    隐式转换发生的条件:

    • 混合类型的算术运算表达式中。例如:
    int a = 3;
    double b = 4.5;
    double c=a + b; 
    // a将会被自动转换为double类型,转换的结果和b进行加法操作
    
    • 不同类型的赋值操作
    int a=‘a’;//字符a转换成对应ASCII码的整数赋值给a
    double b=1;//将1转换成1.0赋值给b
    
    • 函数参数传值
    void func(double a);
    func(1); // 1被隐式的转换为double类型1.0
    
    • 函数返回值
    double add(int a, int b)
    {    
    	return a + b;
    } //运算的结果会被隐式的转换为double类型返回
    

    隐式转换的风险:一般存在于自定义的类构造函数中

    按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象。

    例子:

    class A
    {
    public:
     	A(int i = 5)
    	 {
     	 m_a = i;
     	}
     	void printm()
     	{	
      	cout << m_a << endl;
     	}
    private:
     	int m_a;
    };
    int main()
    {
     A s;//此时调用构造函数,s.m_a应该等于5
     s.printm();
     
     s = 10;//我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
     s.printm();
     
     //实际上,10被隐式转换成了下面的形式,所以才能这样.
     //s = A temp(10);
     system("pause");
     return 0;
    }
    

    运行结果:
    在这里插入图片描述

    禁止类构造函数的隐式转换:

    C++中提供了explicit关键字,在构造函数声明的时候加上explicit关键字,能够禁止隐式转换。
    在上述代码的构造函数上加上explicit,则会发生:

    在这里插入图片描述
    s=10的操作变成非法的了。这样就可以有效的防止隐式转换的发生,从而能够对程序进行精确控制,达到提高品质的目的。

    展开全文
  • 主要介绍了c++隐式类型转换的二个示例,需要的朋友可以参考下
  • C++隐式类型转换

    2018-06-06 07:50:05
    基本数据类型隐式转换 转换原则:低精度向高精度转换 类类型隐式转换 explicit关键字

    基本数据类型隐式转换

    转换原则:低精度向高精度转换

    类类型隐式转换

    explicit关键字

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

    2017-09-16 09:19:56
    “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是...

    http://www.cnblogs.com/QG-whz/p/4472566.html

    《C++ Primer》中提到:

    “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”

    这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。

    那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。

    下面通过代码来看一看:

    复制代码
    #include "stdafx.h"
    #include <string>
    #include <iostream>
    using namespace std ;
    class BOOK  //定义了一个书类
    {
        private:
            string _bookISBN ;  //书的ISBN号
            float _price ;    //书的价格
    
        public:
            //定义了一个成员函数,这个函数即是那个“期待一个实参为类类型的函数”
            //这个函数用于比较两本书的ISBN号是否相同
            bool isSameISBN(const BOOK & other ){
                return other._bookISBN==_bookISBN;
                    }
    
            //类的构造函数,即那个“能够用一个参数进行调用的构造函数”(虽然它有两个形参,但其中一个有默认实参,只用一个参数也能进行调用)
            BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}
    };
    
    int main()
    {
        BOOK A("A-A-A");
        BOOK B("B-B-B");
    
        cout<<A.isSameISBN(B)<<endl;   //正经地进行比较,无需发生转换
    
        cout<<A.isSameISBN(string("A-A-A"))<<endl; //此处即发生一个隐式转换:string类型-->BOOK类型,借助BOOK的构造函数进行转换,以满足isSameISBN函数的参数期待。
        cout<<A.isSameISBN(BOOK("A-A-A"))<<endl;    //显式创建临时对象,也即是编译器干的事情。
        
        system("pause");
    }
    复制代码

         代码中可以看到,isSameISBN函数是期待一个BOOK类类型形参的,但我们却传递了一个string类型的给它,这不是它想要的啊!还好,BOOK类中有个构造函数,它使用一个string类型实参进行调用,编译器调用了这个构造函数,隐式地将stirng类型转换为BOOK类型(构造了一个BOOK临时对象),再传递给isSameISBN函数。

      隐式类类型转换还是会带来风险的,正如上面标记,隐式转换得到类的临时变量,完成操作后就消失了,我们构造了一个完成测试后被丢弃的对象。

      我们可以通过explicit声明来抑制这种转换:

    explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}

        explicit关键字只能用于类内部的构造函数声明上.这样一来,BOOK类构造函数就不能用于隐式地创造对象了,编译上面的代码会出现这样的提示:

      现在用户只能进行显示类型转换,显式地创建临时对象。

     

      总结一下:

    1.   可以使用一个实参进行调用,不是指构造函数只能有一个形参。
    2.   隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。
    3.       explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)。
    展开全文
  • 主要介绍了C++隐式类型转换运算符operator type()用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 避免C++隐式类型转换

    2009-03-16 17:17:00
    避免C++隐式类型转换比如下面的程序,执行 myInt.copy(17); 时,由于找不到匹配的函数,但是有 int 至 MyIntClass 的构造函数,C++的编译器会进行隐式类型转换,即产生一个临时 MyIntClass 对象,效果如同MyIntClass...
  • 从一道面试题看C++隐式类型转换 Posted on 2013-03-17 14:52 XiaoH在博客园 阅读(894) 评论(4) 编辑 收藏   所谓隐式类型转换,就是定义的不同类型的数据在运算时,由编译器自行转换撑同一数据类型后再...
  • 隐式类型转换构造函数:
  • 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的。 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。很多时候用户可能都不知道进行了哪些转换。 为什么要进行...
  • 2.什么是隐式类型转换 转换规则由编译器自动执行,无需程序员介入 3.何时产生隐式类型转换 1)在混合类型的表达式中,其操作数转换为相同的类型. (操作符的两边) int ival; int dval; i
  • C++中可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换(单个参数,或多个参数,但除了第一个参数都有默认参数)。如:#include&lt;iostream&gt; #include&lt;string&...
  • 就是C++智能指针都会提到一点: 由于智能指针是一个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if (my_smart_object.get())。 但是我在写osg的时候,下意识都是直接...
  • 对于operator关健字用于运算符重载这我们都知道,其实operator还有另外一种作用:强制类型转换。上一周为了对应项目中一个问题,同事帮助写了一个类,使用到了operator的强制类型转换作用,后来source review的时候...
  • 在C/C++中对两个基本数据类型进行比较时,如果类型不匹配,要注意是否会引起严重问题,以下是...在上面三个例子中,因为有符号i与无符号0u进行比较,i被隐式转换为无符号类型,导致出现了逻辑错误,死循环,数组越界

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,727
精华内容 25,090
关键字:

c++隐式类型转换

c++ 订阅