在C ++中键入转换/转换混淆

时间:2010-12-02 16:29:54

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

什么是类型转换以及什么是类型转换

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

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

4 个答案:

答案 0 :(得分:16)

转化是指将某个值转换为其他类型的值。结果是目标类型的值,并且有什么输出值由(源类型的)输入产生的规则。

例如:

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

结果是unsigned int值等于i modulo UINT_MAX+1,此规则是该语言的一部分。因此,在这种情况下,值(英文)仍为“3”,但它是无符号的int值3,与有符号的int值3略有不同。

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

投射”是一种明确的转化。

例如:

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

答案 1 :(得分:3)

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

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

float f = 3.14; 
int i = f; //float converted to int by dropping the fraction

可以改写为:

float f = 3.14;
int i = static_cast<int>(f); //same thing

答案 2 :(得分:2)

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

E.G。

void f(int x){}

char c; 

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

对转化进行了排名,您可以在promotions vs. conversions进行谷歌搜索以获取更多详细信息。

C ++中有5个显式强制转换运算符static_castconst_castreinterpret_castdynamic_cast,以及C-style cast

答案 3 :(得分:2)

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