谭浩强《C++程序设计》例9.5错误分析与解决方案
5星 · 超过95%的资源 需积分: 10 48 浏览量
更新于2024-09-16
收藏 45KB DOC 举报
"谭浩强的《C++程序设计(2004年版)》中的例9.5存在代码不兼容问题,涉及到C++与旧C风格的混合使用,导致在不同编译器下的编译结果不同。"
在C++编程中,不同编译器对标准的实现可能存在差异,这在谭浩强的《C++程序设计(2004年版)》的例9.5中体现得尤为明显。这个例子中,作者提到VC6.0(Visual C++ 6.0)无法编译,而DJGPP的GCC可以,但实际情况恰恰相反。这个问题的根源在于代码混合了C++的string类型和C风格的字符数组,导致编译器兼容性问题。
问题出在三个地方:
1. 构造函数参数列表中的`string nam`,这是C++的string类型。
2. 构造函数函数体中的`name=nam`,试图将一个string对象赋值给另一个。
3. 私有变量列表中的`char name[10]`,这是一个C风格的字符数组。
这三个语句在C++标准中是不兼容的,因为它们分别代表了C++的字符串类、C++的string对象赋值操作和C语言的字符数组。因此,当使用不同的编译器时,由于对C++标准的实现不同,编译器可能会对此产生错误或警告。
解决这个问题的方案有三种:
a) 使用C++风格:将`char name[10]`改为`string name`,保持其他部分不变。
b) 使用老C风格:将`string nam`改为`char* nam`,并将`name=nam`改为`strcpy(name, nam)`,`char name[10]`不变。
c) 仍然使用老C风格:将`string nam`改为`char nam[10]`,同时`name=nam`改为`strcpy(name, nam)`,`char name[10]`不变。
这些方案的主要目标是确保数据类型的兼容性,消除编译器报错,如"cannot convert from X to Y"。
原代码示例:
```cpp
#include <string>
#include <iostream>
using namespace std;
class Student // 声明Student类
{
public:
Student(int n, string nam, char s) // (1) string nam
{
num = n;
name = nam; // (2) name=nam
sex = s;
cout << "Constructor called." << endl;
}
~Student()
{
cout << "Destructor called." << endl;
}
void display()
{
cout << "num: " << num << endl;
cout << "name" << endl; // 缺少显示name的逻辑
}
private:
int num;
char sex;
char name[10]; // (3) char name[10]
};
```
为了使这段代码在各种编译器下都能正常编译和运行,你需要根据所选方案调整`name`的定义和使用方式。这展示了在编写跨平台或跨编译器的C++代码时,对编译器差异的理解和适配是多么重要。
2017-09-16 上传
178 浏览量
150 浏览量
2022-10-24 上传
2011-03-18 上传
247 浏览量
2013-09-27 上传
203 浏览量
lyb111357
- 粉丝: 0
- 资源: 2
最新资源
- BottleJS快速入门:演示JavaScript依赖注入优势
- vConsole插件使用教程:输出与复制日志文件
- Node.js v12.7.0版本发布 - 适合高性能Web服务器与网络应用
- Android中实现图片的双指和双击缩放功能
- Anum Pinki英语至乌尔都语开源词典:23000词汇会话
- 三菱电机SLIMDIP智能功率模块在变频洗衣机的应用分析
- 用JavaScript实现的剪刀石头布游戏指南
- Node.js v12.22.1版发布 - 跨平台JavaScript环境新选择
- Infix修复发布:探索新的中缀处理方式
- 罕见疾病酶替代疗法药物非临床研究指导原则报告
- Node.js v10.20.0 版本发布,性能卓越的服务器端JavaScript
- hap-java-client:Java实现的HAP客户端库解析
- Shreyas Satish的GitHub博客自动化静态站点技术解析
- vtomole个人博客网站建设与维护经验分享
- MEAN.JS全栈解决方案:打造MongoDB、Express、AngularJS和Node.js应用
- 东南大学网络空间安全学院复试代码解析