C++ 学习之旅(14)——构造函数constructors和析构函数destructors
首先我们看下一个简单的类:
#include <iostream>class Entity
{public:float X, Y;void Print(){std::cout << X << "," << Y << std::endl;}
};int main()
{Entity e;e.Print();std::cin.get();
}
输出结果如下:
这个很奇怪的数字,实际上就是系统随机分配的数,因为我们还没有对X和Y进行初始化,而在C++中,不进行初始化的变量是不能使用的,如下:
#include <iostream>class Entity
{public:float X, Y;void Print(){std::cout << X << "," << Y << std::endl;}
};int main()
{Entity e;std::cout << e.X << "," << e.Y << std::endl;e.Print();std::cin.get();
}
会报错“error C4700: uninitialized local variable ‘e’ used”,虽然X和Y是public
,而且e也已经被实例化了,但是未初始化的变量还是不能使用。
这时,我们可以定义一个初始化函数Init():
#include <iostream>class Entity
{public:float X, Y;void Init(){X = 0;Y = 0;}void Print(){std::cout << X << "," << Y << std::endl;}
};int main()
{Entity e;e.Init();std::cout << e.X << "," << e.Y << std::endl;e.Print();std::cin.get();
}
输出结果为:
但是我们会想,如果每次实例化之后都要写一行初始化函数的代码,是不是太麻烦了?
Entity e1;
e1.Init();
Entity e2;
e2.Init();
Entity e3;
e3.Init();
这时候,构造函数就派上用场了,使用它可以更方便地进行初始化:
#include <iostream>class Entity
{public:float X, Y;Entity(){X = 0;Y = 0;}void Print(){std::cout << X << "," << Y << std::endl;}
};int main()
{Entity e;std::cout << e.X << "," << e.Y << std::endl;e.Print();std::cin.get();
}
只需要写一个与类名相同的函数作为初始化函数,这样每次实例化的时候就会自动调用这个函数,省去了写调用函数代码的功夫。
与其他函数一样,你也可以向构造函数传入参数:
#include <iostream>class Entity
{public:float X, Y;Entity(float x, float y){X = x;Y = y;}void Print(){std::cout << X << "," << Y << std::endl;}
};int main()
{Entity e(1.5, 2.5);std::cout << e.X << "," << e.Y << std::endl;e.Print();std::cin.get();
}
输出结果如下:
有构造函数,就有相反操作的析构函数。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。例子如下:
#include <iostream>class Entity
{public:float X, Y;Entity(){std::cout << "Entity is constructed!" << std::endl;}~Entity(){std::cout << "Entity is destructed!" << std::endl;}
};void Function()
{Entity e;
}int main()
{Function();std::cin.get();
}
如果在main函数中实例化Entity,构造函数和析构函数的输出要在main函数退出时才能看到,而此时程序也退出了,所以使用一个Function,在其中进行实例化,结果如图:
C++ 学习之旅(14)——构造函数constructors和析构函数destructors相关推荐
- 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中
小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...
- 乐鑫Esp32学习之旅14 esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录html界面。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...
- Android热修复学习之旅——HotFix完全解析
在上一篇博客 Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于An ...
- 九阳道人的MFC学习之旅
九阳道人的MFC学习之旅 好记性不如烂笔头,MFC用过很多遍了,每次用完后就很久不去碰,之后就忘了怎么用MFC,现在特此记录. 文章目录 九阳道人的MFC学习之旅 1.修改程序版本信息 2.截获和处理 ...
- java message bus_【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例...
今年项目组做的是Cloud产品,有幸接触到了云计算的知识,也了解并使用了当今流行的云计算平台Amazon AWS与Microsoft Azure.我们的产品最初只部署在AWS平台上,现在产品决定同时支 ...
- java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅
全文共10735字,预计学习时长22分钟或更长 有一款生命周期管理工具(也称云服务)叫做Valohai,它有着友好的用户界面和简洁的布局设计. 许多有关Valohai的案例和文档都是基于Python和 ...
- 文章目录 | .NET Core on K8s学习之旅 (更新至20200618)
.NET Core on K8s学习之旅 更新记录: -- 20200511 增加Ingress & Nginx Ingress介绍 -- 20200515 增加Ocelot API网关集成示 ...
- WCF学习之旅—实现支持REST客户端应用(二十四)
WCF学习之旅-实现REST服务(二十二) WCF学习之旅-实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...
- HALCON学习之旅(七)
HALCON学习之旅(七) 文章目录 HALCON学习之旅(七) 1.MFC与Halcon混合编程 2.C#与Halcon混合编程 3.Halcon测量助手使用 4.Halcon实例进阶一(拟合区域椭 ...
最新文章
- python机械臂api_使用高斯机械臂的API开发
- windos 2008 vista 下的端口范围改变
- Android--实现自制录音/播放录音程序
- ActiveMQ:了解内存使用情况
- python三方库打包项目中_将Python库打包到项目中
- Vim设置支持鼠标,光标定位,滚轮上下移动
- 计算机硬件基础英语ppt,计算机硬件技术基础,computer hardware technology elements,音标,读音,翻译,英文例句,英语词典...
- 全国计算机民办二本学校排行,艺术类二本院校排名,2018最新民办和公办院校全国排名...
- uni-app本站点必须要开启JavaScript才能运行
- 【Flex】“安装的AdobeFlashPlayer不是调试器”解决办法之详解
- 【TWS使用系列1】如何从TWS的自选列表中添加/删除自选股?
- 利用HTML自制鬼灭之刃动态壁纸
- HTML设置水平居中的几种方式
- 一日精通python编程_爱上Python:一日精通Python编程
- 有些话很轻、很淡、很疼!+ 有些话,经典的让人想流泪
- JS——判断变量类型方法汇总
- easyx的基础应用教程
- 迈出数据安全建设的第一步|公安数据分类分级建设案例实践
- 离散数学知识总结 第十一章 几种特殊的图
- tomcat布置前端项目
热门文章
- rest_framework12:多登陆方式与自动签发token/配置过期时间
- thinkphp出现Call to undefined function Think\C() in ... online 313
- 优化-浏览器缓存和压缩优化
- 【BIM入门实战】Revit 图元分类有哪三种?Revit图元分类图文详解
- Matlab插值方法大全
- 解决点击MDI父窗体下拉菜单,子窗体重复出现的问题
- C语言试题六十三之请编写函数fun:将s所指字符串中ascii值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
- 趣学算法之斐波拉契数列实现
- 抽走超大桌布之后保持桌面物体不掉,需要多快的速度?
- 各种震撼的慢镜头,奇怪的知识又增加了!​