C++数据类型转换全解析
立即解锁
发布时间: 2025-08-19 01:36:31 阅读量: 29 订阅数: 29 AIGC 


C++面向对象编程入门与实践
### C++ 数据类型转换全解析
在 C++ 编程中,数据类型转换是一个常见且重要的操作。当我们使用 `=` 运算符进行赋值时,如果等号两边的数据类型相同,无论是基本类型还是用户自定义类型,编译器都能轻松处理赋值操作。例如:
```cpp
intvar1 = intvar2;
dist3 = dist1 + dist2;
```
然而,当等号两边的变量类型不同时,情况就变得复杂起来。接下来,我们将深入探讨不同类型之间的转换问题。
#### 基本类型之间的转换
基本类型之间的转换在 C++ 中是非常常见的操作。比如我们有如下语句:
```cpp
intvar = floatvar;
```
这里 `intvar` 是 `int` 类型,`floatvar` 是 `float` 类型。编译器会自动调用一个特殊的例程,将 `floatvar` 的浮点格式值转换为整数格式,以便赋值给 `intvar`。这种转换有很多种,像从 `float` 到 `double`,从 `char` 到 `float` 等等。这些转换都是隐式的,因为它们在代码列表中并不明显。
有时候,我们需要强制编译器进行类型转换,这时就可以使用强制类型转换运算符。例如,将 `float` 转换为 `int`,可以这样写:
```cpp
intvar = static_cast<int>(floatvar);
```
这种转换是显式的,从代码中可以明显看出 `static_cast<int>()` 是用于将 `float` 转换为 `int` 的。不过,显式转换和隐式转换使用的是相同的内置例程。
#### 对象与基本类型之间的转换
当需要在用户自定义数据类型和基本类型之间进行转换时,我们不能依赖编译器的内置转换例程,因为编译器对用户自定义类型的了解仅限于我们所提供的信息。因此,我们必须自己编写这些转换例程。
下面通过一个具体的例子来展示如何在基本类型和用户自定义类型之间进行转换。在这个例子中,用户自定义类型是之前示例中的 `English Distance` 类,基本类型是 `float`,我们用它来表示米(公制长度单位)。
以下是 `ENGLCONV` 示例代码:
```cpp
// englconv.cpp
// conversions: Distance to meters, meters to Distance
#include <iostream>
using namespace std;
class Distance //English Distance class
{
private:
const float MTF; //meters to feet
int feet;
float inches;
public: //constructor (no args)
Distance() : feet(0), inches(0.0), MTF(3.280833F)
{ } //constructor (one arg)
Distance(float meters) : MTF(3.280833F)
{ //convert meters to Distance
float fltfeet = MTF * meters; //convert to float feet
feet = int(fltfeet); //feet is integer part
inches = 12*(fltfeet-feet); //inches is what’s left
} //constructor (two args)
Distance(int ft, float in) : feet(ft),
inches(in), MTF(3.280833F)
{ }
void getdist() //get length from user
{
cout << "\nEnter feet: "; cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void showdist() const //display distance
{ cout << feet << "\'-" << inches << '\"'; }
operator float() const //conversion operator
{ //converts Distance to meters
float fracfeet = inches/12; //convert the inches
fracfeet += static_cast<float>(feet); //add the feet
return fracfeet/MTF; //convert to meters
}
};
int main()
{
float mtrs;
Distance dist1 = 2.35F; //uses 1-arg constructor to
//convert meters to Distance
cout << "\ndist1 = "; dist1.showdist();
mtrs = static_cast<float>(dist1); //uses conversion operator
//for Distance to meters
cout << "\ndist1 = " << mtrs << " meters\n";
Distance dist2(5, 10.25); //uses 2-arg constructor
mtrs = dist2; //also uses conversion op
cout << "\ndist2 = " << mtrs << " meters\n";
// dist2 = mtrs; //error, = won’t convert
return 0;
}
```
在 `main()` 函数中,程序首先使用单参数构造函数将固定的 `float` 量(2.35,表示米)转换为英尺和英寸:
```cpp
Distance dist1 = 2.35F;
```
然后,通过以下语句将 `Distance` 对象转换为米:
```cpp
mtrs = static_cast<float>(dist2);
mtrs = dist2;
```
程序的输出如下:
```
dist1 = 7’-8.51949” ←this is 2.35 meters
dist1 = 2.35 meters ←this is 7’–8.51949”
dist2 = 1.78435 meters ←this is 5’–10.25”
```
接下来,我们深入分析 `Distance` 成员函数中类型转换的具体实现。
##### 从基本类型到用户自定义类型
从基本类型(这里是 `float`)转换为用户自定义类型(如 `Distance`),我们使用单参数构造函数,也称为转换构造函数。在 `ENGLCONV` 中,这个构造函数如下:
```cpp
Distance(float meters)
{
float fltfeet = MTF * meters;
feet = int(fltfeet);
inches = 12 * (fltfeet-feet);
}
```
当使用单个参数创建 `Distance` 对象时,会调用这个函数。该函数假设这个参数表示米,将其转换为英尺和英寸,并将结果赋值给对象。例如,在以下语句中:
```cpp
Distance dist1 = 2.35;
```
在创建对象的同时,完成了从米到 `Distance` 的转换。
##### 从用户自定义类型到基本类型
从用户自定义类型转换为基本类型,需要创建一个转换运算符。在 `ENGLCONV` 中,转换运算符的实现如下:
```cpp
operator float()
{
float fracfeet = inches/12;
fracfeet += float(feet);
return fracfeet/MTF;
}
```
这个运算符会将其所属的 `Distance` 对象的值转换为表示米的 `float` 值,并返回该值。它可以通过显式强制类型转换调用:
```cpp
mtrs = static_cast<float>(dist1);
```
也可以通过简单赋值调用:
```cpp
mtrs = dist2;
```
这两种形式都能将 `Distance` 对象转换为对应的米的 `float` 值。
#### C 字符串和字符串对象之间的转换
下面的例子展示了如何使用单参数构造函数和转换运算符在 `C` 字符串和自定义 `String` 类对象之间进行转换。
```cpp
// strconv.cpp
// convert between ordinary strings and class String
#include <iostream>
using namespace std;
#include <string.h> //for strcpy(), etc.
class String //user-defined string type
{
private:
enum { SZ = 80 }; //size of all String objects
char str[SZ]; //holds a C-string
public:
String() //no-arg constructor
{ str[0] = '\0'; }
String( char s[] ) //1-arg constructor
{ strcpy(str, s); } // convert C-string to String
v
```
0
0
复制全文
相关推荐










