一步一步学习C++(类)之构造函数与析构函数

来源:互联网 发布:方正综艺简体下载 mac 编辑:程序博客网 时间:2024/05/08 10:08

一旦创建了一个类的对象,有时候就需要有一个有意义的初始值,当对象的生命周期结束时,有时候需要释放对象的内存单元。构造函数和析构函数是两个非常特殊的函数:它们没有返回值。这与返回值为void的普通函数显然不同,虽然void 普通函数没有返回任何值,但还可以让它做点别的事情,而构造函数和析构函数则不允许。

在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行。如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由客户程序员自己来显式的调用构造函数与析构函数,这样一来,安全性就被人破坏了。另外,析构函数不带任何参数,因为析构不需任何选项。

一、构造函数

在类实例化对象时自动执行,对类中的数据进行初始化。构造函数可以重载,可以有多个,但是只能有一个缺省构造函数。

二、析构函数

在撤销对象占用的内存之前,进行一些操作的函数。析构函数不能被重载,只能有一个。
#ifndef _Tstudent_H_#define _Tstudent_H_#include <string.h>#pragma onceclass Tstudent{private:char name[20];int score[2];double aver;public:Tstudent(void);Tstudent(char *stuname,int Chinese,int Math);//重载函数~Tstudent(void);void setAver(int Chinese,int Math);void SetName(char *stuname);void Print(void);};#endif
<pre name="code" class="cpp">#include "StdAfx.h"#include "Tstudent.h"#include <string.h>Tstudent::Tstudent(void){printf("Constructors被调用\n");//构造函数}Tstudent::Tstudent(char *stuname,int Chinese,int Math){strcpy(name,stuname);score[0] = Chinese;score[1] = Math;aver = (score[0] + score[1])/2;printf("构造函数被调用\n");}Tstudent::~Tstudent(void){printf("Destructors被调用\n");//构造函数}void Tstudent::SetName(char *stuname){strcpy(name,stuname);}void Tstudent::setAver(int Chinese,int Math){aver = 0;score[0] = Chinese;score[1] = Math;aver = (score[0] + score[1])/2;}void Tstudent::Print(){printf("%s\n",name);printf("%1f\n",aver);}

// DefineAndRealize.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Point.h"#include "Tstudent.h"int _tmain(int argc, _TCHAR* argv[]){//Point M;        //用定义好的类创建一个对象 点M//M.setPoint(10, 20); //设置 M点 的x,y值//M.printPoint();     //输出 M点 的信息Tstudent stu1("张三",95,97);Tstudent stu2("李四",83,92);stu1.Print();stu2.Print();Tstudent stu3;stu3.SetName("王五");stu3.setAver(98,98);stu3.Print();return 0;}
由于析构函数是等return 0;之后才会打印出来,所以上面结果没有显示完全

三、显示调用构造函数与析构函数

Tstudent *Mystudent = new Tstudent;Mystudent->~Tstudent();delete Mystudent;
Constructors被调用
Destructors被调用
Destructors被调用
有时候,在对象的生命周期结束前,想先结束这个对象的时候就会派上用场了。直接调用析构函数并不释放对象所在的内存。
new的时候,其实做了三件事,一是:调用::operator new分配所需内存二是:调用构造函数。三是:返回指向新分配并构造的对象的指针。
delete的时候,做了两件事,一是:调用析构函数,二是:调用::operator delete释放内存。


四、拷贝初始化构造函数

拷贝构造函数,又称复制构造函数,是一种特殊的构造函数
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
详细的留在下一节~~

0 0
原创粉丝点击