【问题标题】:Type Conversion/Casting Confusion in C++C++ 中的类型转换/铸造混淆
【发布时间】:2011-05-19 05:57:48
【问题描述】:

什么是类型转换,什么是类型转换

我应该什么时候使用它们?

详细信息:对不起,如果这是一个明显的问题;我是 C++ 新手,来自红宝石背景,习惯于 to_sto_i 等。

【问题讨论】:

    标签: c++ type-conversion casting conversion-operator


    【解决方案1】:

    转换是当一个值,嗯,转换为不同的类型。结果是目标类型的值,并且对于从什么输入(源类型)产生什么输出值有规则。

    例如:

    int i = 3;
    unsigned int j;
    j = i; // the value of "i" is converted to "unsigned int".
    

    结果是等于iUINT_MAX+1unsigned int 值,并且此规则是语言的一部分。因此,在这种情况下,值(英文)仍然是“3”,但它是一个无符号整数值 3,与有符号整数值 3 略有不同。

    请注意,转换是自动发生的,我们只是在需要无符号 int 值的位置使用了带符号的 int 值,并且语言定义了这意味着什么,而我们实际上并没有说我们正在转换。这称为“隐式转换”。

    Casting”是一种显式转换。

    例如:

    unsigned int k = (unsigned int)i;
    long l = long(i);
    unsigned int m = static_cast<unsigned int>(i);
    

    都是演员表。具体来说,根据标准的 5.4/2,k 使用 cast-expression,而根据 5.2.3/1,l 使用等效的东西(除了我用过不同的类型)。 m 使用“类型转换运算符”(static_cast),但标准的其他部分也将其称为“强制转换”。

    用户定义的类型可以定义“转换函数”,它提供了将你的类型转换为另一种类型的特定规则,并且单参数构造函数也用于转换:

    struct Foo {
        int a;
        Foo(int b) : a(b) {}                   // single-arg constructor
        Foo(int b, int c) : a(b+c) {}          // two-arg constructor
        operator float () { return float(a); } // conversion function
    };
    
    Foo f(3,4);              // two-arg constructor
    f = static_cast<Foo>(4); // conversion: single-arg constructor is called
    float g = f;             // conversion: conversion function is called
    

    【讨论】:

      【解决方案2】:

      经典转换(类似于 C 中的 (Bar)foo,在 C++ 中与 reinterpret_cast&lt;&gt; 一起使用)是指假设变量的实际内存内容是不同类型的变量。类型转换(即 Boost 的 lexical_cast&lt;&gt; 或其他转换类型的用户定义函数)是执行某些逻辑以将变量从一种类型实际转换到另一种类型,例如整数到字符串,其中一些代码运行以从给定的整数逻辑形成一个字符串。

      还有静态和动态转换,它们用于继承,例如,强制在子类型 (dynamic_cast&lt;&gt;) 上使用父成员函数,反之亦然 (static_cast&lt;&gt;)。静态转换还允许您执行典型的“隐式”类型转换,当您执行以下操作时会发生:

      浮动 f = 3.14; 诠释 i = f; //浮点数通过删除分数转换为int

      可以改写为:

      浮动 f = 3.14; int i = static_cast(f); //一样

      【讨论】:

      • +1,但应该注意的是,该术语并未严格遵守。考虑int i; float f = static_cast&lt;float&gt;(i)——按照你的逻辑(我同意),这是一个conversion,而不是一个演员表。 C++ 仍然使用static_cast(是的,我知道隐式转换可以在这里工作)。换句话说:您已经给出了这两个术语在语义上最有意义的区别。但 C++ 不遵循这种区别。
      • 编辑澄清一些事情,希望我没有传播错误信息。
      • 您似乎在说 cast-expression (5.4/2) 不是转换,而是转换。对于一般编程语言来说,这可能是“cast”与“conversion”的有用定义,但它不是 C++ 标准中使用的“cast”定义。
      【解决方案3】:

      在 C++ 中,任何表达式都有类型。当您在需要另一种类型的值(例如类型 D)的上下文中使用一种类型的表达式(例如类型 S)时,编译器会尝试将表达式从 S 类型转换为 D 类型。如果这样的隐式转换不'不存在,这会导致错误。单词类型转换不是标准的,但与转换相同。

      例如

      void f(int x){}
      
      char c; 
      
      f(c); //c is converted from char to int.
      

      对转化进行排名,您可以通过 Google 搜索 promotions vs. conversions 了解更多详情。

      C++ 中有 5 个显式转换运算符static_castconst_castreinterpret_castdynamic_cast,还有C-style cast

      【讨论】:

      • 哇,谢谢大家,没想到这么快就得到这么好的答案,谢谢!
      • @Ell: C++ 标签很忙 :)
      【解决方案4】:

      类型转换是指您实际将一个类型转换为另一种类型,例如将字符串转换为整数,反之亦然,类型转换是指内存的实际内容未更改,但编译器将其解释为不同的方式。

      【讨论】:

        【解决方案5】:

        类型转换表明您正在以不同的方式处理内存块。

        int i = 10;
        int* ip = &i;
        char* cp = reinterpret_cast<char*>(ip);
        if ( *cp == 10 )  // Here, you are treating memory that was declared
        {                 // as int to be char.
        }
        

        类型转换表示您正在将值从一种类型转换为另一种类型。

        char c = 'A';
        int i = c;  // This coverts a char to an int.
                    // Memory used for c is independent of memory
                    // used for i.
        

        【讨论】:

          猜你喜欢
          • 2013-02-17
          • 2017-02-11
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-24
          相关资源
          最近更新 更多