一步一步学习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) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
详细的留在下一节~~
相关文章推荐
- C++学习 -- 构造函数和析构函数
- 【菜鸟C++学习笔记】12.构造函数与析构函数
- c++基础学习7-c++构造函数和析构函数
- C++学习笔记-2-构造函数和析构函数
- 【C++学习】构造函数、拷贝构造函数、析构函数小结
- C++学习笔记(17)——虚函数与构造函数、析构函数
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序
- c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)
- 学习C++ -> 构造函数与析构函数
- C++学习:构造函数和析构函数
- C++学习之路—继承与派生(二):派生类的构造函数与析构函数
- C++学习笔记_2:单一继承时的构造函数与析构函数
- C++学习笔记12 构造函数与析构函数下
- C++学习摘要之二:构造函数和析构函数
- 学习C++ -> 构造函数与析构函数
- EffectiveC++第三章构造函数析构函数和赋值操作符学习笔记
- 我的C++学习之路--02.构造函数和析构函数
- Java程序员学习C++之构造函数和析构函数调用的时机
- 学习C++——构造函数和析构函数