首先我们看下一个简单的类:

#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相关推荐

  1. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中

    小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...

  2. 乐鑫Esp32学习之旅14 esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录html界面。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  3. Android热修复学习之旅——HotFix完全解析

    在上一篇博客 Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于An ...

  4. 九阳道人的MFC学习之旅

    九阳道人的MFC学习之旅 好记性不如烂笔头,MFC用过很多遍了,每次用完后就很久不去碰,之后就忘了怎么用MFC,现在特此记录. 文章目录 九阳道人的MFC学习之旅 1.修改程序版本信息 2.截获和处理 ...

  5. java message bus_【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例...

    今年项目组做的是Cloud产品,有幸接触到了云计算的知识,也了解并使用了当今流行的云计算平台Amazon AWS与Microsoft Azure.我们的产品最初只部署在AWS平台上,现在产品决定同时支 ...

  6. java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅

    全文共10735字,预计学习时长22分钟或更长 有一款生命周期管理工具(也称云服务)叫做Valohai,它有着友好的用户界面和简洁的布局设计. 许多有关Valohai的案例和文档都是基于Python和 ...

  7. 文章目录 | .NET Core on K8s学习之旅 (更新至20200618)

    .NET Core on K8s学习之旅 更新记录: -- 20200511 增加Ingress & Nginx Ingress介绍 -- 20200515 增加Ocelot API网关集成示 ...

  8. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅-实现REST服务(二十二) WCF学习之旅-实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  9. HALCON学习之旅(七)

    HALCON学习之旅(七) 文章目录 HALCON学习之旅(七) 1.MFC与Halcon混合编程 2.C#与Halcon混合编程 3.Halcon测量助手使用 4.Halcon实例进阶一(拟合区域椭 ...

最新文章

  1. python机械臂api_使用高斯机械臂的API开发
  2. windos 2008 vista 下的端口范围改变
  3. Android--实现自制录音/播放录音程序
  4. ActiveMQ:了解内存使用情况
  5. python三方库打包项目中_将Python库打包到项目中
  6. Vim设置支持鼠标,光标定位,滚轮上下移动
  7. 计算机硬件基础英语ppt,计算机硬件技术基础,computer hardware technology elements,音标,读音,翻译,英文例句,英语词典...
  8. 全国计算机民办二本学校排行,艺术类二本院校排名,2018最新民办和公办院校全国排名...
  9. uni-app本站点必须要开启JavaScript才能运行
  10. 【Flex】“安装的AdobeFlashPlayer不是调试器”解决办法之详解
  11. 【TWS使用系列1】如何从TWS的自选列表中添加/删除自选股?
  12. 利用HTML自制鬼灭之刃动态壁纸
  13. HTML设置水平居中的几种方式
  14. 一日精通python编程_爱上Python:一日精通Python编程
  15. 有些话很轻、很淡、很疼!+ 有些话,经典的让人想流泪
  16. JS——判断变量类型方法汇总
  17. easyx的基础应用教程
  18. 迈出数据安全建设的第一步|公安数据分类分级建设案例实践
  19. 离散数学知识总结 第十一章 几种特殊的图
  20. tomcat布置前端项目

热门文章

  1. rest_framework12:多登陆方式与自动签发token/配置过期时间
  2. thinkphp出现Call to undefined function Think\C() in ... online 313
  3. 优化-浏览器缓存和压缩优化
  4. 【BIM入门实战】Revit 图元分类有哪三种?Revit图元分类图文详解
  5. Matlab插值方法大全
  6. 解决点击MDI父窗体下拉菜单,子窗体重复出现的问题
  7. C语言试题六十三之请编写函数fun:将s所指字符串中ascii值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
  8. 趣学算法之斐波拉契数列实现
  9. 抽走超大桌布之后保持桌面物体不掉,需要多快的速度?
  10. 各种震撼的慢镜头,奇怪的知识又增加了!​