鸡啄米:C++编程之十四学习之构造函数和析构函数

1. 本人学习鸡啄米课程的笔记记录,用来记录学习的历程和进度

2. 构造函数

我们在声明一个变量时,如果对它进行了初始化,那么在为此变量分配内存空间时还会向内存单元中写入变量的初始化。声明对象有相似的过程,程序执行时遇到对象声明语句时会向操作系统申请一定的内存空间来存放这个对象,但是它能像一般变量那样初始化时写入指定的初始值吗?类的对象太复杂了,要实现这一点不太容易,这就需要构造函数来实现。

构造函数的作用就是在对象被创建时利用特定的初始值构造对象,把对象置于某一个初始状态,它在对象被创建的时候由系统自动调用,我们只需要使用默认的构造函数或者自己定义构造函数,而不用管怎么调用的。

构造函数也是类的成员函数,除了有成员函数的所有特征外,还有一些不同之处:构造函数的函数名跟类名一样,而且没有返回值。构造函数一般被声明为公有函数,除非我们不允许某个类生成对象则将它声明为private或protected属性。编译器碰到对象声明语句时,会自动生成对构造函数的调用语句,所以我们常说构造函数是在对象声明时由系统自动调用的。

如果没有定义类的构造函数,编译器编译时会自动生成一个默认形式的构造函数,这个构造函数不做任何事,那么为什么还要生成它呢?因为C++在对象建立时都会调用构造函数,所以如果没有自己定义构造函数,那么即使是什么都不做的构造函数也是要有的。

3. 现在在Clock类中加入自己定义的构造函数:

1 class Clock
2 {
3         public:
4                   Clock(int NewH, int NewM, int NewS);              //构造函数
5                   void SetTime(int NewH, int NewM, int NewS);
6                   void ShowTime();
7         private:
8                   int Hour, Minute, Second;
9 };

4. 构造函数的实现

1  Clock::Clock(int NewH, int NewM, int NewS)
2 {
3                  Hour=NewH;
4                  Minute=NewM;
5                  Second=NewS;
6 }

5. main函数调用

1 int main()
2 {
3                 Clock c(0,0,0); //隐含调用构造函数,将初始值作为实参。
4                 c.ShowTime();
5                 return 0;
6 }

6. 拷贝构造函数

我们可以将一个变量的值赋给另一个同类型的变量,那么可以将一个对象的内容拷贝给相同类的另一个对象吗?可以,我们可以将第一个对象的数据变量的值分别赋给另一个对象的数据变量,但是,如果数据变量数很多的话那将是很麻烦的,这时候我们就需要有拷贝构造函数。

拷贝构造函数是一种特殊的构造函数,因为它也是用来构造对象的。它具有构造函数的所有特性。拷贝构造函数的作用是用一个已经存在的对象去初始化另一个对象,这两个对象的类类型应该是一样的。定义拷贝构造函数的形式是:

 1 class 类名
 2        {
 3         public :
 4                    类名(形参);                    //构造函数
 5                    类名(类名 &对象名);   //拷贝构造函数
 6            ...
 7        };
 8        类名::类(类名 &对象名)    //拷贝构造函数的实现
 9        {
10                  函数体
11        }

7. 举例说明拷贝构造函数

 1 class Point
 2 {
 3        public:
 4                    Point(int xx=0,int yy=0)    {X=xx; Y=yy;}
 5                    Point(Point &p);
 6                    int GetX() {return X;}
 7                    int GetY() {return Y;}
 8        private:
 9                    int  X, Y;
10 };

8. 构造函数的具体实现

1  Point::Point(Point &p)
2 {
3                   X=p.X;
4                   Y=p.Y;
5                   cout<<"拷贝构造函数被调用"<<endl;
6 }

9.析构函数

自然万物都是有生有灭的,类的对象也一样是有生命周期的,一样会消亡。鸡啄米给大家讲一种情况:如果在函数中声明了一个对象,那么在这个函数运行完返回调用函数时,声明的对象也会释放,就像上面说的fun2函数中对象A那样。

在对象释放时都有什么工作要做呢?我们经常遇到的情况就是:构造函数时动态申请了一些内存单元,在对象释放时就要同时释放这些内存单元。动态分配内存的知识后面鸡啄米会讲。

析构函数和构造函数的作用是相反的,它会在对象被删除之前做一些清理工作。析构函数是在对象要被删除时由系统自动调用的,它执行完后对象就消失了,分配的内存空间也释放了。

析构函数是类的一个公有函数成员,它的名称是在类名前加“~”形成,不能有返回值,大家注意下,它和构造函数不同的是它不能有任何形参。如果没有定义析构函数系统也会自动生成一个默认析构函数,默认析构函数也不会做任何工作。一般如果我们想在对象被删除之前做什么工作就可以把它写到析构函数里。

10. 析构函数举例

 1 class Point
 2 {
 3        public:
 4                    Point(int xx, int yy);
 5                    ~Point();
 6                    //...其他函数原型
 7        private:
 8                   int X, int Y;
 9                   char *p;
10 };

11. 析构函数具体实现

 Point::Point(int xx,int yy)
{
                 X=xx;
                 Y=yy;
                 p=new char[20];     // 构造函数中动态分配char型内存
}
Point::~Point()
{
                delete []char;      // 在类析构时释放之前动态分配的内存
}

原文地址:https://www.cnblogs.com/429512065qhq/p/8283380.html

时间: 2024-10-29 18:49:06

鸡啄米:C++编程之十四学习之构造函数和析构函数的相关文章

《鸡啄米C++编程入门系列》系列技术文章整理收藏

<鸡啄米C++编程入门系列>系列技术文章整理收藏 收藏整理鸡啄米C++编程入门系列文章,供个人和网友学习C++时参考 1鸡啄米:C++编程入门系列之前言 2鸡啄米:C++编程入门系列之一(进制数) 3鸡啄米:C++编程入门系列之二(原码.反码与补码) 4鸡啄米:C++编程入门系列之三(VS2010的使用介绍) 5鸡啄米:C++编程入门系列之四(数据类型) 6鸡啄米:C++编程入门系列之五(运算符和表达式) 7鸡啄米:C++编程入门系列之六(算法的基本控制结构之选择结构) 8鸡啄米:C++编程入

鸡啄米:C++编程之十三学习之类与对象,类的声明,成员的访问控制

1. 本次学习鸡啄米课程第13篇,把比较重要的学习记录下来,以敦促自己更好的学习.推荐他们的网址学习:http://www.jizhuomi.com/school/c/97.html 2. 在面向过程的设计中,程序的模块是函数构成的,而面向对象设计中程序模块是类构成的,函数只是语句和数据的封装,而类是函数和数据的封装,做了一段C++之后,才明白这句话的意思.其实类就是一种自定义的数据类型.可以定义某个类类型的变量,用类定义的变量叫做类的对象,这种定义对象的过程叫做实例化. 3. 不过一直有个疑问

鸡啄米MFC教程笔记之二:MFC应用程序框架分析

这一节鸡啄米就为大家分析下MFC应用程序框架的运行流程. 一.SDK应用程序与MFC应用程序运行过程的对比 程序运行都要有入口函数,在之前的C++教程中都是main函数,而Windows应用程序的入口函数是WinMain函数,MFC程序也是从WinMain函数开始的.下面鸡啄米就给出用Windows SDK写的“HelloWorld”程序,与MFC应用程序框架进行对比,这样能更好的了解框架是怎样运行的.Windows SDK开发程序就是不使用MFC类库,直接用Windows API函数进行软件开

鸡啄米MFC教程笔记之四:对话框:创建对话框模板和修改对话框属性

---恢复内容开始--- 本节开始为大家讲解偏应用的知识-创建对话框. 对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是个对话框,只是它做了很多美工方面的工作,将其大大美化了. 创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件:  第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 这里鸡啄米就再创建一个基于对话框的应用程序,用来实现加法运算的功能.如下:

鸡啄米MFC教程笔记之七:对话框:为控件添加消息处理函数

MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理.比如我们点击按钮时就会产生BN_CLICKED消息,修改编辑框内容时会产生EN_CHANGE消息等.一般为了让某种操作达到效果,我们只需要实现某个消息的消息处理函数. 一.添加消息处理函数 鸡啄米仍以前面的加法计算器的程序为例,说明怎样为“计算”按钮控件添加消息处理函数.添加方法列出4种: 1.使用Class Wizard添加消息处理函数 用过的VC++6.0的朋友应该对Class Wizard很熟

shell编程(十四)--- until循环

until循环语法格式: until CONDITION do     statement done 说明: until进入循环的条件是:condition不成立时,就执行循环. until进入循环的条件正好和while相反,while进入循环的条件是:condition成立时,就进入循环. 示例1:while循环 [[email protected] Learn]# cat while.sh  #!/bin/bash declare -i sum=0 declare -i i=0 while 

C#高级编程五十四天----Lookup类和有序字典

Lookup类 Dictionary<Tkey,TValue>只为每个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictionary<Tkey,TElement>,但把键映射带一个值集上.这个类在程序及System.Core中实现,用System,Linq命名空间定义. Lookup<Tkey,TElement>的方法和属性如下表: 属性名或者方法名 说明 Count 属性Count返回集合中的元素个数 Ite

鸡啄米MFC教程笔记之一:MFC和VC++

VC++简介 VC++全称是Visual C++,是由微软提供的C++开发工具,它与C++的根本区别就在于,C++是语言,而VC++是用C++语言编写程序的工具平台.VC++不仅是一个编译器更是一个集成开发环境,包括编辑器.调试器和编译器等,一般它包含在Visual Studio中.Visual Studio包含了VB.VC++.C#等编译环境.当然我们在使用VC++ 6.0的时候为了轻便,总是只单独安装VC++ 6.0.但自微软2002年发布Visual Studio.NET以来,微软建立了在

【读书笔记】C#高级编程 第二十四章 文件和注册表操作

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.