C++面向对象编程入门构造函数与析构函数.docx
- 文档编号:2038481
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:7
- 大小:17.61KB
C++面向对象编程入门构造函数与析构函数.docx
《C++面向对象编程入门构造函数与析构函数.docx》由会员分享,可在线阅读,更多相关《C++面向对象编程入门构造函数与析构函数.docx(7页珍藏版)》请在冰豆网上搜索。
C++面向对象编程入门构造函数与析构函数
我们创建了一个带有字符指针的带有形参的Teacher(char*input_name)的构造函数,调用它创建对象的使用类名加对象名称加扩号和扩号内参数的方式调用,这和调用函数有点类似,但意义也有所不同,因为构造函数是为创建对象而设立的,这里的意义不单纯是调用函数,而是创建一个类对象。
上面代码中的Student类成员中teacher成员是的定义是用类Teacher进行定义创建的,那么系统碰到创建代码的时候就会自动调用Teacher类中的Teacher()构造函数对对象进行初始化工作!
上面代码中的Student类成员中teacher成员是的定义是用类Teacher进行定义创建的,那么系统碰到创建代码的时候就会自动调用Teacher类中的Teacher()构造函数对对象进行初始化工作!
建议大家编译运行代码观察调用情况,程序将在结束前也就是对象生命周期结束的时候自动调用~Teacher()
~Teache()中的delete[]director;就是清除堆内存的代码,这与我们前面一开始提到的。
name=input_name;//这样赋值是错误的
有直接的关系,因为delete操作符只能清空堆空间而不能清楚桟空间,如果强行清除栈空间内存的话将导致程序崩溃!
前面我们已经简单的说了类的构造函数和析构函数,我们知道一个类的成员可以是另外一个类的对象,构造函数允许带参数,那么我们可能会想到上面的程序我们可以在类中把Student类中的teacher成员用带参数的形式调用Student类的构造函数,不必要再在Teacher类中进行操作,由于这一点构想我们把程序修改成如下形式:
#include
#include
usingnamespacestd;
classTeacher
{
public:
Teacher(char*temp)
{
director=newchar[10];
strcpy(director,temp);
}
~Teacher()
{
cout<<"释放堆区director内存空间1次";
delete[]director;
cin.get();
}
char*show();
protected:
char*director;
};
char*Teacher:
:
show()
{
returndirector;
}
classStudent
{
public:
Student()
{
number=1;
score=100;
}
voidshow();
protected:
intnumber;
intscore;
Teacherteacher("王大力");//错误,一个类的成员如果是另外一个类的对象的话,不能在类中使用带参数的构造函数进行初始化
};
voidStudent:
:
show()
{
cout< } voidmain() { Studenta; a.show(); Studentb[5]; for(inti=0;i { b[i].show(); } cin.get(); } 可是很遗憾,程序不能够被编译成功,为什么呢? 因为: 类是一个抽象的概念,并不是一个实体,并不能包含属性值(这里来说也就是构造函数的参数了),只有对象才占有一定的内存空间,含有明确的属性值! 这一个问题是类成员初始化比较尴尬的一个问题,是不是就没有办法解决了呢? 呵呵。 。 。 。 。 。 c++为了解决此问题,有一个很独特的方法,下一小节我们将介绍。 对于上面的那个"尴尬"问题,我们可以在构造函数头的后面加上: 号并指定调用哪那个类成员的构造函数来解决! 教程写到这里的时候对比了很多书籍,发现几乎所有的书都把这一章节叫做构造类成员,笔者在此觉得有所不妥,因为从读音上容易混淆概念,所以把这一小节的名称改为构造类的成员比较合适 代码如下: #include usingnamespacestd; classTeacher { public: Teacher(char*temp) { director=newchar[10]; strcpy(director,temp); } ~Teacher() { cout<<"释放堆区director内存空间1次"; delete[]director; cin.get(); } char*show(); protected: char*director; }; char*Teacher: : show() { returndirector; } classStudent { public: Student(char*temp): teacher(temp) { number=1; score=100; } voidshow(); protected: intnumber; intscore; Teacherteacher; }; voidStudent: : show() { cout< } voidmain() { Studenta("王大力"); a.show(); //Studentb[5]("王大力"); //这里这么用是不对的,数组不能够使用带参数的构造函数,以后我们将详细介绍vector类型 //for(inti=0;i //{ // b[i].show(); //} cin.get(); } 大家可以发现最明显的改变在这里 Student(char*temp): teacher(temp) 冒号后的teacher就是告诉调用Student类的构造函数的时候把参数传递给成员teacher的Teacher类的构造函数,这样一来我们就成功的在类体外对teacher成员进行了初始化,既方便也高效,这种冒号后指定调用某成员构造函数的方式,可以同时制定多个成员,这一特性使用逗号方式,例如: Student(char*temp): teacher(temp),abc(temp),def(temp) 由冒号后可指定调用哪那个类成员的构造函数的特性,使得我们可以给类的常量和引用成员进行初始化成为可能。 我们修改上面的程序,得到如下代码: #include #include usingnamespacestd; classTeacher { public: Teacher(char*temp) { director=newchar[10]; strcpy(director,temp); } ~Teacher() { cout<<"释放堆区director内存空间1次"; delete[]director; cin.get(); } char*show(); protected: char*director; }; char*Teacher: : show() { returndirector; } classStudent { public: Student(char*temp,int&pk): teacher(temp),pk(pk),ps(10) { number=1; score=100; } voidshow(); protected: intnumber; intscore; Teacherteacher; int&pk; constintps; }; voidStudent: : show() { cout< } voidmain() { char*t_name="王大力"; intb=99; Studenta(t_name,b); a.show(); cin.get(); } 改变之处最重要的在这里Student(char*temp,int&pk): teacher(temp),pk(pk),ps(10) 调用的时候我们使用 Studenta(t_name,b); 我们将b的地址传递给了int&pk这个引用,使得Student类的引用成员pk和常量成员ps进行了成功的初始化。 但是细心的人会发现,我们在这里使用的初始化方式并不是在构造函数内进行的,而是在外部进行初始化的,的确,在冒号后和在构造函数括号内的效果是一样的,但和teacher(temp)所不同的是,pk(pk)的括号不是调用函数的意思,而是赋值的意思,我想有些读者可能不清楚新标准的c++对变量的初始化是允许使用括号方式的,inta=10和inta(10)的等价的,但冒号后是不允许使用=方式只允许()括号方式,所以这里只能使用pk(pk)而不能是pk=pk了。 这一小节的内容是说对象构造的顺序的,对象构造的顺序直接关系程序的运行结果,有时候我们写的程序不错,但运行出来的结果却超乎我们的想象,了解c++对对象的构造顺序有助于解决这些问题。 c++规定,所有的全局对象和全局变量一样都在主函数main()之前被构造,函数体内的静态对象则只构造一次,也就是说只在首次进入这个函数的时候进行构造! 代码如下: #include #include usingnamespacestd; classTest { public: Test(inta) { kk=a; cout<<"构
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面向 对象 编程 入门 构造 函数
![提示](https://static.bdocx.com/images/bang_tan.gif)