#include<iostream> #include<cstring> using namespace std; class Student { int age; char *name; public: Student ( ):age(18) { name = new char[10]; strcpy(name,"noName"); cout<<"default construct "<<endl; } Student (int a , char *str) { A-4 name = new char[strlen(str)+1]; strcpy(name,str); age= a>0 ? a: 0; cout<<"construct "<<name<<endl; }~ Student () { cout<<"destruct "<<name<<endl; if(name )delete[] name; } }; int main() { Student * pp = new Student (18,"Zhang"); Student p; delete pp; return 0输出什么
时间: 2024-03-10 13:46:41 浏览: 101
这段代码的输出应该是:
```
construct Zhang
default construct
destruct Zhang
destruct noName
```
首先,通过 `Student * pp = new Student (18,"Zhang");` 创建了一个名为 pp 的指向堆上 Student 对象的指针,并调用了带参数的构造函数,输出了 `construct Zhang`。
然后,通过 `Student p;` 创建了一个名为 p 的 Student 对象,并调用了默认构造函数,输出了 `default construct`。
接着,通过 `delete pp;` 删除了在堆上创建的 Student 对象,调用了析构函数,输出了 `destruct Zhang`。
最后,程序结束时,会自动调用 p 对象的析构函数,输出了 `destruct noName`。
相关问题
#include<iostream> #include<string> #include<string.h> using namespace std; class Student { private: long num; int age; char* name; public: Student(long n,int a,const char* nam) { num=n; age=a; name=new char[strlen(nam)+1]; strcpy(name,nam); } void show_Student () { cout<<num<<" "<<age<<" "<<name<<" "<<endl; } void modify_name () { char* nam; cin>>nam; delete []name; name=new char[strlen(nam)+1]; strcpy(name,nam); } }; int main() { Student a(20222484,18,"lyc"); a.show_Student(); a.modify_name(); a.show_Student(); return 0; }优化上面代码
以下是优化后的代码:
```cpp
#include<iostream>
#include<string>
#include<cstring> // 使用cstring头文件代替string.h
using namespace std;
class Student {
private:
long num;
int age;
string name; // 使用string代替char*
public:
Student(long n, int a, const string& nam) : num(n), age(a), name(nam) {} // 使用初始化列表
void show_Student() {
cout << num << " " << age << " " << name << " " << endl;
}
void modify_name() {
string nam;
cin >> nam;
name = nam;
}
};
int main() {
Student a(20222484, 18, "lyc");
a.show_Student();
a.modify_name();
a.show_Student();
return 0;
}
```
优化的点如下:
1. 使用了string代替char*,避免手动内存管理和越界访问等问题。
2. 使用了初始化列表,避免在构造函数内部对成员变量进行赋值,提高代码效率。
3. 使用了cstring头文件代替string.h,cstring是C++中的标准头文件,string.h是C语言的头文件,虽然两者都可以使用,但是cstring更符合C++的风格。
#include<iostream> #include<cstring> using namespace std; class PersonFactory { int id; char name[50]; int age; public: PersonFactory(int i = 0, char * nm = 0, int a = 15);//i:id;nm:name;a:age virtual ~PersonFactory() {}; virtual void PrintInfo() { cout << id << endl; cout << name << endl; cout << age << endl; }; PersonFactory * CreateStudent(int id, char *name, int age, int grade); PersonFactory * CreateTeacher(int id, char *name, int age, char *department); }; int main() { PersonFactory vn; PersonFactory *ps,*pt; int id,age,grade; char name[50],department[50]; cin>>id>>name>>age>>department; ps=vn.CreateTeacher (id,name,age,department); ps->PrintInfo (); cin>>id>>name>>age>>grade; ps=vn.CreateStudent (id,name,age,grade); ps->PrintInfo (); return 0; }请依据这段代码,将其补全完成上个问题将上个问题
以下是补全后的代码:
```
#include<iostream>
#include<cstring>
using namespace std;
class PersonFactory
{
int id;
char name[50];
int age;
public:
PersonFactory(int i = 0, char * nm = 0, int a = 15)
{
id = i;
strcpy(name, nm);
age = a;
}
virtual ~PersonFactory() {};
virtual void PrintInfo()
{
cout << id << endl;
cout << name << endl;
cout << age << endl;
};
class Student : public PersonFactory
{
int grade;
public:
Student(int i, char *nm, int a, int g) : PersonFactory(i, nm, a)
{
grade = g;
}
void PrintInfo()
{
PersonFactory::PrintInfo();
cout << grade << endl;
}
};
class Teacher : public PersonFactory
{
char department[50];
public:
Teacher(int i, char *nm, int a, char *dp) : PersonFactory(i, nm, a)
{
strcpy(department, dp);
}
void PrintInfo()
{
PersonFactory::PrintInfo();
cout << department << endl;
}
};
PersonFactory * CreateStudent(int id, char *name, int age, int grade)
{
return new Student(id, name, age, grade);
}
PersonFactory * CreateTeacher(int id, char *name, int age, char *department)
{
return new Teacher(id, name, age, department);
}
};
int main()
{
PersonFactory vn;
PersonFactory *ps,*pt;
int id,age,grade;
char name[50],department[50];
cin>>id>>name>>age>>department;
pt=vn.CreateTeacher (id,name,age,department);
pt->PrintInfo ();
cin>>id>>name>>age>>grade;
ps=vn.CreateStudent (id,name,age,grade);
ps->PrintInfo ();
return 0;
}
```
这个程序使用了工厂模式,其中 PersonFactory 类是一个抽象基类,包含了一个虚函数 PrintInfo(),用于打印人员的信息。它有两个派生类,分别是 Student 和 Teacher,分别表示学生和教师。在 PersonFactory 类中,定义了两个工厂方法 CreateStudent() 和 CreateTeacher(),用于创建学生和教师对象。在 main() 函数中,首先调用 CreateTeacher() 方法创建一个教师对象,然后调用 PrintInfo() 方法打印出教师的信息;接着调用 CreateStudent() 方法创建一个学生对象,然后调用 PrintInfo() 方法打印出学生的信息。
阅读全文