#include <iostream> #include <string.h> #include <stdio.h> using namespace std; class Person { public: Person(char *vn, int vage, float vh, float vw); Person(const Person &vref); void Print(); ~Person(); private: char *pName;//姓名 int age;//年龄 float height;//身高 float weight;//体重 }; //构造函数 Person::Person(char *vn, int vage, float vh, float vw) { age = vage; height = vh; weight = vw; strcpy(pName, vn); cout << age << endl; cout << height << endl; cout << weight << endl; cout << pName << endl; } //拷贝构造函数 Person::Person(const Person &vref) { int len = strlen(vref.pName); pName = new char[len]; age = vref.age; height = vref.height; weight = vref.weight; strcpy(pName, vref.pName); } //输出函数 void Person::Print() { cout << age << endl; cout << height << endl; cout << weight << endl; cout << pName << endl; } Person::~Person() { if (!pName == NULL) { delete[]pName; pName = NULL; } } int main() { string A; double B, C, D; cin >> A >> B >> C >> D; Person A1(A, B, C, D); }
时间: 2023-12-03 22:47:34 浏览: 100
这段代码有一些问题:
1. 在构造函数中,没有为 pName 分配内存,只是复制了指针,这可能导致程序崩溃。
2. 在拷贝构造函数中,同样没有为 pName 分配内存,只是复制了指针,这也可能导致程序崩溃。
3. 在析构函数中,应该检查指针是否为空,如果不为空,才进行释放操作。
4. 在 main 函数中,使用了一个 string 类型的变量 A,但是在 Person 类的构造函数中,要求传入的是 char* 类型的指针,这会导致编译错误。
5. 在 main 函数中,使用了一个 double 类型的变量 B,但是在 Person 类的构造函数中,要求传入的是 int 类型的年龄,这也会导致编译错误。
6. 在 main 函数中,没有调用 Person 类的输出函数,也就是没有输出对象的信息。
下面是修改后的代码:
```c++
#include <iostream>
#include <string.h>
using namespace std;
class Person {
public:
Person(char *vn, int vage, float vh, float vw);
Person(const Person &vref);
void Print();
~Person();
private:
char *pName;//姓名
int age;//年龄
float height;//身高
float weight;//体重
};
//构造函数
Person::Person(char *vn, int vage, float vh, float vw) {
age = vage;
height = vh;
weight = vw;
pName = new char[strlen(vn) + 1];
strcpy(pName, vn);
cout << age << endl;
cout << height << endl;
cout << weight << endl;
cout << pName << endl;
}
//拷贝构造函数
Person::Person(const Person &vref) {
int len = strlen(vref.pName);
pName = new char[len + 1];
age = vref.age;
height = vref.height;
weight = vref.weight;
strcpy(pName, vref.pName);
}
//输出函数
void Person::Print() {
cout << age << endl;
cout << height << endl;
cout << weight << endl;
cout << pName << endl;
}
Person::~Person() {
if (pName != NULL) {
delete[]pName;
pName = NULL;
}
}
int main() {
char A[100];
int B;
float C, D;
cin >> A >> B >> C >> D;
Person A1(A, B, C, D);
A1.Print();
return 0;
}
```
在修改后的代码中,我们为 pName 分配了内存,并在析构函数中进行了释放。同时,我们也将 main 函数中的输入类型和 Person 类的构造函数要求的类型进行了对应。最后,我们调用了 Person 类的输出函数,输出了对象的信息。
阅读全文