CPerson::CPerson(long i,char* p,int a) { ID=i; Name=new char[strlen(p)+1]; strcpy(Name,p); Age=a; }
时间: 2023-12-06 08:41:37 浏览: 27
这是一个 C++ 类 CPerson 的构造函数。函数的参数包括长整型 i、字符指针 p 和整型 a。函数体内部首先将 i 赋值给类的成员变量 ID,然后分配内存空间给类的成员变量 Name,并将 p 中的字符串复制到 Name 中。最后将 a 赋值给类的成员变量 Age。需要注意的是,在使用完 Name 后需要手动释放内存空间,否则容易造成内存泄漏。
相关问题
CPerson::CPerson(const CPerson& ob)//拷贝构造函数定义 { ID=ob.ID; Name=new char[strlen(ob.Name)+1]; strcpy(Name,ob.Name); Age=ob.Age; }
这是一个类CPerson的拷贝构造函数的定义。拷贝构造函数用于在创建对象时,使用已存在的对象来初始化新创建的对象。它的参数是一个常量引用,表示要拷贝的对象。下面是函数的具体实现:
```
CPerson::CPerson(const CPerson& ob)
{
ID = ob.ID;
Name = new char[strlen(ob.Name) + 1];
strcpy(Name, ob.Name);
Age = ob.Age;
}
```
在这个函数中,首先将参数对象的ID赋值给新创建的对象的ID。然后,使用动态内存分配来为新对象的Name成员变量分配内存。这里使用了strlen()函数来计算字符串的长度,并且需要加1,以便为字符串末尾的空字符留出空间。接下来,使用strcpy()函数将参数对象的Name成员变量的值复制到新对象的Name成员变量中。最后,将参数对象的Age赋值给新对象的Age成员变量。这样,新对象就完成了从参数对象的拷贝。
#include<iostream> using namespace std; class CPerson{ protected: long id; char* name; int age; public: CPerson(long i,char* n,int a):id(i),name(n),age(a){ } CPerson(){ } CPerson(const CPerson &C){ id=C.id; name=C.name; age=C.age; } ~CPerson(){ delete name; } void set(){ cout<<"ID:"; cin>>id; cout<<"NAME:"; cin>>name; cout<<"AGE:"; cin>>age; } void display(){ cout<<"id:"<<id<<" name:"<<name<<" age:"<<age<<endl; } }; int main(){ CPerson obj1(1002,"LiMing",22); obj1.display(); CPerson obj2(obj1); obj2.set(); obj2.display(); return 0; }为什么警告
在这段代码中,有两个问题会导致警告:
1. 字符串指针未初始化。在类中,使用 `char*` 类型的字符串指针作为成员变量,需要在构造函数中对其进行初始化,否则会导致未定义的行为。可以使用动态内存分配来初始化字符串指针,例如 `name = new char[20];`。
2. 拷贝构造函数未正确实现。在拷贝构造函数中,需要将字符串指针所指向的内存空间也进行拷贝,而不仅仅是拷贝指针本身。可以使用 `strcpy()` 函数来实现字符串指针的拷贝,例如 `strcpy(name, C.name);`。同时,需要注意对字符串指针进行内存分配和释放。
修复后的代码如下:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class CPerson {
protected:
long id;
char* name;
int age;
public:
CPerson(long i, char* n, int a) : id(i), age(a) {
name = new char[strlen(n) + 1];
strcpy(name, n);
}
CPerson() {
id = 0;
name = new char[1];
name[0] = '\0';
age = 0;
}
CPerson(const CPerson& C) {
id = C.id;
age = C.age;
name = new char[strlen(C.name) + 1];
strcpy(name, C.name);
}
~CPerson() {
delete[] name;
}
void set() {
cout << "ID:";
cin >> id;
cout << "NAME:";
char tmp[20];
cin >> tmp;
if (name != nullptr) {
delete[] name;
}
name = new char[strlen(tmp) + 1];
strcpy(name, tmp);
cout << "AGE:";
cin >> age;
}
void display() {
cout << "id:" << id << " name:" << name << " age:" << age << endl;
}
};
int main() {
CPerson obj1(1002, "LiMing", 22);
obj1.display();
CPerson obj2(obj1);
obj2.set();
obj2.display();
return 0;
}
```