#include<iostream> #include<cstring> using namespace std; class Name { public : Name( char *pN ) ; Name operator=(Name ) ; ~ Name() ; char *pName ; } ; int main() { int i; cin>>i; if(i==0) return 0; Name Obj1("ZhangSan") ; Name Obj3("Noname") ; Obj3 = Obj1 ; return 0; } Name::Name ( char *pN ) { cout <<" Constructing " << pN <<" "<< endl ; pName = new char[ strlen( pN ) + 1 ] ; if( pName != 0 ) strcpy( pName,pN ) ; } Name Name::operator= (Name Obj ) { delete []pName ; pName = new char[ strlen( Obj.pName ) + 1 ] ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } Name::~ Name() { cout << " Destructing " << pName <<" "<< endl ; pName[0] = '\0' ; delete []pName ; } 上述程序中含有内存错误,原因在于复制构造函数的缺失。请填写复制构造函数,完成深复制。注意,复制构造函数中不需要任何输出信息。
时间: 2025-06-26 16:02:49 浏览: 3
在您提供的代码中,`Name` 类实现了构造函数、赋值运算符重载以及析构函数,但在程序运行过程中可能会出现问题。原因是当 `Obj3 = Obj1;` 被调用时会触发赋值操作,而如果没有正确的复制构造函数,在某些场景下可能导致浅拷贝问题。
### 填充的复制构造函数
```cpp
Name::Name(const Name &obj) {
pName = new char[strlen(obj.pName) + 1];
if (pName != nullptr)
strcpy(pName, obj.pName);
}
```
此复制构造函数用于创建新对象并从现有对象初始化它。我们分配了新的内存空间,并将原对象的内容完整地复制过来,以避免两个指针指向相同的内存区域的问题。
### 修改后的完整代码
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class Name {
public:
Name(char *pN);
Name(const Name &obj); // 添加复制构造函数声明
Name operator=(Name);
~Name();
char *pName;
};
// 构造函数
Name::Name(char *pN) {
cout << " Constructing " << pN << " " << endl;
pName = new char[strlen(pN) + 1];
if (pName != 0)
strcpy(pName, pN);
}
// 复制构造函数
Name::Name(const Name &obj) {
pName = new char[strlen(obj.pName) + 1];
if (pName != nullptr)
strcpy(pName, obj.pName);
}
// 操作符=
Name Name::operator=(Name Obj) {
delete[] pName;
pName = new char[strlen(Obj.pName) + 1];
if (pName != 0)
strcpy(pName, Obj.pName);
return *this;
}
// 析构函数
Name::~Name() {
cout << " Destructing " << pName << " " << endl;
pName[0] = '\0';
delete[] pName;
}
int main() {
int i;
cin >> i;
if (i == 0) return 0;
Name Obj1("ZhangSan");
Name Obj3("Noname");
Obj3 = Obj1;
return 0;
}
```
通过添加复制构造函数,可以保证每次传递或返回类的对象时不会出现浅拷贝引发的数据混乱情况。
阅读全文
相关推荐

















