13

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

我应该什么时候使用它们中的每一个?

细节:对不起,如果这是一个明显的问题;我是 C++ 的新手,来自红宝石背景并且已经习惯了to_s等等to_i

4

5 回答 5

18

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

例如:

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

结果是unsigned int等于imodulo的值UINT_MAX+1,并且此规则是语言的一部分。因此,在这种情况下,值(英文)仍然是“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
于 2010-12-02T16:36:13.540 回答
3

经典强制转换(类似于(Bar)foo在 C 中的东西,在 C++ 中使用reinterpret_cast<>)是当变量的实际内存内容被假定为不同类型的变量时。类型转换(即 Boostlexical_cast<>或其他转换类型的用户定义函数)是执行某些逻辑以将变量从一种类型实际转换为另一种类型,例如整数到字符串,其中一些代码运行以逻辑地形成一个字符串给定的整数。

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

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

可以重写为:

浮动 f = 3.14;
int i = static_cast<int>(f); //一样
于 2010-12-02T16:35:08.337 回答
2

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

例如

void f(int x){}

char c; 

f(c); //c is converted from char to int.

转化是排名的,您可以谷歌promotions vs. conversions了解更多详细信息。

C++ 中有 5 个显式类型转换运算符static_castconst_cast,reinterpret_castdynamic_cast, 还有C-style cast

于 2010-12-02T16:37:09.443 回答
2

类型转换是当您实际将类型转换为另一种类型时,例如将字符串转换为整数,反之亦然,类型转换是指内存的实际内容没有改变,但编译器以不同的方式解释它.

于 2010-12-02T16:41:38.573 回答
1

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

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.
于 2016-12-04T18:44:29.043 回答