您的位置:首页 > 编程语言 > C语言/C++

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

2015-04-05 21:03 232 查看

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

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

一、构造函数

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

二、析构函数

在撤销对象占用的内存之前,进行一些操作的函数。析构函数不能被重载,只能有一个。

#ifndef _Tstudent_H_
#define _Tstudent_H_

#include <string.h>

#pragma once

class 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) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

详细的留在下一节~~


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: