写在前面:
前几天在C++课上学习了类的创建与相关操作,由于能力不够,理解有限,因此做作业的时候一头雾水,只能连蒙带猜稀里糊涂的“应付”了一下,又因为俗事所扰,课业繁多等多种因素,最后还是没有复习学过的内容,想想之前每晚熬夜学习编程的日子,愧疚不已,今天看了一下《C++ Primer Plus》这本书,把关于构造函数与析构函数的一些浅显的心得记录一下,日后有了新的体会再接着更新。
正文:
由于类要满足数据隐藏的性质,class类中对象的默认类型是私有的(private),因此我们不能从外界直接对class类中的对象进行初始化,故需要引入合适的成员函数–这便引入了构造函数。
我们假设创建了一个学生类如下:
class student {
string name, num;
int chinese, math, english;
double total;
public:
//void input();
void output();
};
如果用户没有在类中声明构造函数的话,那么程序便会使用默认的构造函数。
student() {}
奇怪的是,当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须要为它提供默认的构造函数。如果提供了非默认构造函数,但没有提供默认构造函数,则下面的声明将出错:
student stu;
这样做可能是想禁止创建未初始化的对象。如果想要创建对象,而不是显式的初始化,我们就需要构造默认的构造函数。对于默认构造函数,有两种创建的方法:
(1)可以对已有构造函数的所有参数提供默认值(对所有参数均进行初始化):
student(string name = "none", string num = "none", int chinese = 0, int math = 0, int english = 0)
(2)另一种方式是通过函数重载来定义另一个构造函数–一个没有参数的构造函数:
student();
值得注意的一点是,如果在类中同时创建以上两个构造函数,程序就会报错,因此只能创建其中的一种。

一个很重要的点是:
在设计类时,通常应提供所有类成员做隐式初始化的默认构造函数,例如:
student() //默认构造函数
{
name = "none";
num = "none";
chinese = math = english = total = 0;
}
测试:
我尝试重新创建了一下student类,如下:
class student {
string name, num;
int chinese, math, english;
double total;
public:
student() //默认构造函数
{
name = "none";
num = "none";
chinese = math = english = total = 0;
}
student(string name, string num, int chinese, int math, int english)
{
this->name = name;
this->num = num;
this->chinese = chinese;
this->math = math;
this->english = english;
}
//void input();
void output();
~student() {}
};
1.主函数中调用与最终结果显示:

可以看到,对于stu1,因为不含有任何参数,因此它调用了在类中创建的默认构造函数,由于我们在默认构造函数中对对象进行了隐式初始化,因此输出的结果即为初始化的值。
对于stu2,我们对它进行显式初始化,将初始化参数通过构造函数传递给类中的对象。
2.
将不带参数的隐式初始化构造函数删掉,将类创建如下:
class student {
string name, num;
int chinese, math, english;
int total;
public:
student(string name = "none", string num = "none", int chinese = 0, int math = 0, int english = 0)
{
this->name = name;
this->num = num;
this->chinese = chinese;
this->math = math;
this->english = english;
}
student(string name, string num, int chinese, int math, int english)
{
this->name = name;
this->num = num;
this->chinese = chinese;
this->math = math;
this->english = english;
};
void output();
~student() {}
};
会发现编译失败,显示如下:

这是因为默认隐式构造函数与我们创建的显式构造函数参数相同,类型相同,而函数重载的条件为:
1.函数有不同参数
2.函数有不同参数类型
显然,上述两个构造函数只是在默认参数值上有所不同,并没有实质性的改变,因此IDE会报错重定义。
同类多变量构造函数的调用顺序:
析构函数:
对象过期时,程序会自动调用一个特殊的成员函数,也就是析构函数。
作用:释放内存,完成清理工作等。
与构造函数不同的是,析构函数没有参数,因此student的析构函数原型必须是这样的:
~student();
如果为对象动态分配了内存,那么在析构函数中应该进行delete操作。
再回顾:
想起上上节课老师布置的作业,创建一个保存学生信息的嵌套类,嵌套关系:
班级–>学生–>生日
最初我绊在了如何透过多层给内层(生日)赋值上,后来参考了同学的代码,发现可以如下,利用类多层嵌套的关系,巧妙逐层调用input()函数达到目的(假设在student类中有Date birthday):
void student::input()
{
cout<<"请依次输入学生信息";
cin>>name>>num>>sex>>chinese>>math>>english;
birthday.input();
}
void Date::input()
{
cout<<"请依次输入出生年月日:";
cin>>year>>month>>day;
}
268

被折叠的 条评论
为什么被折叠?



