
构造函数只是起初始化值的作用,但实例化一个对象的时候,可以通过实例去传递参数,从主函数传递到其他的函数里面,这样就使其他的函数里面有值了。
析构函数与构造函数的作用相反,用于撤销对象的一些特殊任务处理,可以是释放对象分配的内存空间。
把类的声明放在main函数之前,它的作用域是全局的。这样做可以使main函数更简练一些。在main函数中定义了两个对象并且给出了初值,然后输出两个学生的数据。
当主函数结束时调用析构函数,输出stud has been destructe!。值得注意的是,真正实用的析构函数一般是不含有输出信息的。
扩展资料:
当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数此默认构造函数是不带参数的。而一般的方法不存在这一特点。
构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)。
当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
C++程序子类析构时会调用父类的析构函数。
析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了定义一个对象时先调用基类的构造函数、然后调用派生类的构造 函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。
析构函数:
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
1
#include <iostream>
#include <string>
using namespace std;
// 学生类
class Student
{
private:
// 数据成员
int num; // 学号
string name; // 姓名
int age; // 年龄
float score; // 成绩
public:
// 构造函数
Student(int n = 2021001, string na = "Lili", int a = 19, float s = 895)
{
num = n;
name = na;
age = a;
score = s;
}
// 析构函数
~Student()
{
cout << "学号:" << num << ",姓名:" << name << ",~~~" << endl;
}
};
// 研究生类,从学生类公有继承
class Graduate: public Student
{
private:
// 数据成员
string direction; // 研究方向
public:
// 构造函数
Graduate()
{
cout << "construction" << endl;
cout << "请输入研究方向:";
cin >> direction;
}
// 析构函数
~Graduate()
{
cout << "学号:" << num << ",姓名:" << name << ",研究方向:" << direction << ",~~~" << endl;
}
};
int main()
{
// 定义一个不带参数的学生类对象
Student s;
// 定义一个不带参数的研究生类对象
Graduate g;
return 0;
}
在上面的代码中,我们定义了一个名为 Student 的类,数据成员包括学号、姓名、年龄和成绩,成员函数有构造函数和析构函数。我们在构造函数中设置了默认参数值,在析构函数中输出了学号和姓名。
我们还定义了一个名为 Graduate 的类,它从学生类公有继承,增加了一个数据成员——研究方向。在 Graduate 类的构造函数中,我们输出了 "construction" 提示信息,并读取用户输入的研究方向信息给新增成员初始化。在析构函数中,我们输出了学号、姓名和研究方向。
在主函数中,我们定义了一个不带参数的学生类对象 s,和一个不带参数的研究生类对象 g。这样,我们就能够使用这两个对象测试我们所定义的类和函数了。
如果您想继续修改上述代码,可以在主函数中添加更多的测试代码,例如设置学生类对象的数据成员的值,或者输出研究生类对象的数据成员的值等。
2
#include <iostream>
#include <string>
using namespace std;
// 学生类
class Student
{
private:
// 数据成员
int num; // 学号
string name; // 姓名
int age; // 年龄
float score; // 成绩
public:
// 构造函数
Student(int n = 2021001, string na = "Lili", int a = 19, float s = 895)
{
num = n;
name = na;
age = a;
score = s;
}
// 信息输出函数
void pr()
{
cout << "学号:" << num << ",姓名:" << name << ",年龄:" << age << ",成绩:" << score << endl;
}
};
// 研究生类
class Graduate: public Student
{
private:
// 数据成员
string direction; // 研究方向
public:
// 构造函数
Graduate()
{
cout << "construction" << endl;
cout << "请输入研究方向:";
cin >> direction;
}
// 信息输出函数
void pr()
{
cout << "学号:" << num << ",姓名:" << name << ",研究方向:" << direction << endl;
}
};
int main()
{
// 定义一个学生指针,指向一个研究生类对象(申请堆空间)
Student p = new Graduate();
// 通过指针调用信息输出函数
p->pr();
return 0;
}
在上述代码中,我们定义了一个名为 Student 的类,数据成员包括学号、姓名、年龄和成绩,成员函数有构造函数和信息输出函数 pr。构造函数中设置了默认参数值,信息输出函数 pr 输出了学号、姓名、年龄和成绩。
我们还定义了一个名为 Graduate 的类,它从学生类公有继承,增加了一个数据成员——研究方向。在 Graduate 类的构造函数中,我们输出了 "construction" 提示信息,并读取用户输入的研究方向信息给新增成员初始化。信息输出函数 pr 输出了学号、姓名和研究方向。
在主函数中,我们定义了一个名为 p 的学生指针,并使用 new 运算符为研究生类对象申请了堆空间。然后我们通过指针调用信息输出函数 pr,可以看到能够输出研究生类对象的研究方向信息。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)