欢迎有什么关于构造函数,析构函数的问题来讨论
首先我们都知道:类是我们自定义的类型,它可简单可复杂,换句话说,就是类内容所占的空间可大可小。本文所论述的构造函数与析构函数即为此服务。
构造函数
简单来说,就是实例化对象的一个必须函数(为你所建立的对象申请它所需要的内存空间,从而对内存空间内的数据进行操作),因此,每一个正常的class都需要这样一步操作,当系统检测到类中没有此函数时会自动生成一个没有任何参数的构造函数。
- 再简单点说就是申请内存空间的函数。
至于为什么:
class manager{
int age = 666; //这段话显然不对,类是抽象的数据类型,
//不占储存空间,所以需要单独有实例化对象申请空间的动作
};
系统默认生成构造函数(接上):
class manager{
int age ;
public :
manager(){} //构造函数名和类名一样 不打的话系统会默认生成
};
当声明一个类的对象时,编译程序需要为该对象分配空间,也可同时为它的数据成员赋初值。
举个正经的例子:
#include "iostream"
#include "string"
using namespace std;
class manager{
int age ;
string name;
public :
manager(string mana_name,int mana_age)
{
name = mana_name;
age = mana_age;
}
void show()
{
cout << "经理:" << name << endl;
cout << "年龄:" << age << endl;
}
};
int main()
{
manager mana("小智",233);
mana.show();
return 0;
}
运行结果:
经理:小智
年龄:233
当然构造函数还可以改动一些参数,甚至可以不带参数(就像系统默认),可以直接在大括号里进行赋值操作…
析构函数
- 把构造函数反过来就是析构函数了,构造申请的空间析构来清理。
同样若什么都不写,系统会为类自动生成一个析构函数并且在程序运行结束时自动调用析构函数。
析构函数和构造函数一样一个对象只会执行一次。
#include"iostream"
#include "string"
using namespace std;
class Student{
private:
string name; //姓名
string stu_no; //学号
float score; //分数
static int all_num; //学生人数
static float sum; //累加成绩
static float ave; //平均成绩
public:
Student(string name1,string stu_no1,float score1);//自定义的构造函数
~Student(); //自定义构造函数
void show();
void show_count_sum_ave();
};
Student::Student(string name1, string stu_no1, float score1) //类外定义构造函数
{
name = name1;
stu_no = stu_no1;
score = score1;
++all_num; //累加学生人数
sum = sum + score; //累加分数
ave = sum / all_num; //平均成绩
}
Student::~Student() //类外定义析构函数,一般不需要,这里测试用
{
--all_num;
sum = sum - score;
cout << "析构函数调用之后 all_num " << all_num << endl;
cout << "sum " << sum << endl;
}
void Student::show()
{
cout << "姓名" << name << endl;
cout << "学号" << stu_no << endl;
}
void Student::show_count_sum_ave()
{
cout << "学生人数" << all_num << endl;
cout << "平均成绩" << ave << endl;
}
int Student::all_num = 0;
float Student::sum = 0;
float Student::ave = 0;
int main()
{
Student stu0("zxz","201611020429",66);
stu0.show();
stu0.show_count_sum_ave();
Student stu1("xyl","201611020426",99);
stu1.show();
stu1.show_count_sum_ave();
Student stu2("wx", "201611020419", 90);
stu2.show();
stu2.show_count_sum_ave();
return 0;
}
运行结果为:
姓名zxz
学号201611020429
学生人数1
平均成绩66
姓名xyl
学号201611020426
学生人数2
平均成绩82.5
姓名wx
学号201611020419
学生人数3
平均成绩85
析构函数调用之后 all_num 2
sum 165
析构函数调用之后 all_num 1
sum 66
析构函数调用之后 all_num 0
sum 0
- 最开始接触的时候我在反思为什么我只建立了一个析构函数,却调用了三次析构函数,最后查看程序发现对象建立了三次,所以显然会有三次析构函数的执行。
析构函数与构造函数一般每生成一个对象对应分别执行一次。申请空间以及释放空间。