谭浩强《C++程序设计》例9.5错误分析与解决方案

5星 · 超过95%的资源 需积分: 10 3 下载量 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++代码时,对编译器差异的理解和适配是多么重要。