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,在其中进行实例化,结果如图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟我一起学.NetCore之配置变更监听

前言通常程序中配置少不了&#xff0c;配置的修改也避免不了&#xff0c;配置的热更新为此给应用程序带来很大的便捷&#xff0c;不用重启&#xff0c;提高用户体验&#xff1b;但往往有时候需要对修改进行审计&#xff0c;也就是需要记录&#xff0c;有时候也会针对配置修改的…

解决Spring boot整合mybatis,xml资源文件放置及路径配置问题

一:问题描述 1:前言 无论你是将mapper.xml文件是和resources建造在一块&#xff0c;还是将mapper.xml文件和mapper放在一块,我们只要修改在yaml当中的mapper-locations的相对路径即可。&#xff08;前提是你在pom文件中导入了相关的resources路径&#xff09; 2:下方是将map…

C++ 学习之旅(15)——继承inheritance

所谓继承&#xff0c;就是在原有的类的基础上&#xff0c;通过继承它并添加一些新的成员&#xff0c;从而产生出一个新的类。例如我们在游戏有实体Entity和玩家Player&#xff0c;它们都有位置X&#xff0c;Y和一个移动的方法Move&#xff0c;但不同的是玩家有名字Name&#xf…

dotNET Core:编码规范

在项目开发过程中&#xff0c;由于时间紧、任务重&#xff0c;很容易导致面向功能编程。实现相同的功能&#xff0c;代码可以写的很优雅&#xff0c;也可以写的很晦涩和复杂。现在的工作&#xff0c;都需要进行团队协作&#xff0c;代码就需要有一定的规范进行指引&#xff0c;…

C++ 学习之旅(16)——虚函数与纯虚函数virtual

关于虚函数的概念讲解&#xff0c;可以看这篇文章&#xff1a; https://blog.csdn.net/siwuxie095/article/details/71159414 以下用例子进行实际说明&#xff1a; #include <iostream> using namespace std;class Shape { public:int width, height;Shape(int a 0,…

.NET 5 自身就是一个 .NET Standard

微软2014年开源.NET的动作是实现一个全新的.NET Core ,从而引入了一个新的问题&#xff1a;选择代码的编译目标变得困难&#xff0c;需要面对3个环境。因此微软为了解决这个问题&#xff0c;引入了两个主要的概念&#xff1a;目标框架别名&#xff08;Target Framework Moniker…

Springboot后台管理(CRUD)

一:前言 这个就是用springboot实现后台管理(CRUD)的小demo,相比于SSM的配置地狱&#xff0c;springboot的自动配置确实很牛&#xff0c;tomcat都内置&#xff0c;我们想要修改相关的信息只要在yaml配置文件修改就行了&#xff0c;关于Dao层&#xff0c;这个mybatis-plus,quo实…

保护 .NET Core 项目的敏感信息

我们的项目中几乎都会有配置文件&#xff0c;里面可能会存储一些敏感信息&#xff0c;比如数据库连接字符串、第三方API的AppKey和SecretKey等。对于开源项目&#xff0c;这些敏感信息肯定不能随着源代码一起提交到托管平台。对于网站应用大多都是要部署到有公开IP的服务器上的…

背包(二维数组版和一维数组版)

一:前言 这是动态规划的经典题型&#xff0c;那么我们也是 按照动态规划五步走的策略分析的 确定dp数组的含义以及下标的含义确定dp数组的递推公式确定dp数组的初始化确定dp数组的遍历顺序举例验证&#xff08;如果不是做题可省略&#xff09; 二:二维数组 1:示例 2:dp数组…

Azure App Service 健康检查正式发布

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Jason Freeberg, Suwat Bodin翻译&#xff1a;汪宇杰导语通过App Service&#xff0c;可以在流量增加时自动将应用程序自动扩展到多个实例。这样可以提高您应用的吞吐量&#xff0c;但是如果其中一个实例发生未捕获的异常怎么办…

Azure Cosmos Db 介绍及演示

Azure Cosmos DB 是 Microsoft 提供的全球分布式多模型数据库服务。Cosmos DB是一种NoSql数据库&#xff0c;但是它兼容多种API。它支持SQL, MongoDB、Cassandra或 Gremlin&#xff0c;你可以挑选自己喜欢的方式进行存储跟访问。主要优势统包式全局分发凭借 Cosmos DB&#xff…

leetcode049. 最后一块石头的重量 II

一:题目 二:上码 class Solution { public:/**思路:1.分析题意只要我们将石头分为尽可能相同的两堆,他们的重量相减后剩余的重量就是最小。 物品的重量为stones[i];物品的价值也为stone[i];temp代表总重量的一半那么我们最终得到的stones[temp]:就是背包容量为temp的最大重量为…

大改革,GNOME 3.x将直接跳到GNOME 40

GNOME 3.38 发布后&#xff0c;GNOME 基金会宣布了用于 GNOME 的新版本控制方案&#xff0c;将于2021年3月发布的下一版 GNOME 将是 GNOME 40。你没看错&#xff0c;版本号直接从现在的 3.x 跳到了 40。以 GNOME 40 为例&#xff0c;其开发周期将包含三个阶段&#xff0c;对应的…

.NET Core + Kubernetes:StatefulSet

在 Kubernetes 中&#xff0c;Pod 资源的控制器 Deployment、Replicaset、Daemonset 等常用于管理无状态应用&#xff0c;它们所管理的 Pod 对应的 IP、名字&#xff0c;启停顺序等都是随机的&#xff0c;Pod 之间也并不存在任何关联关系。而实际情况下&#xff0c;在应用集群部…

python编程中的小问题汇总

前言 本文记录了我在python编程中遇到的各种小问题&#xff0c;持续更新。 1. x x 1 VS x 1 辨析下面这两段代码&#xff1a; >>> x y [1, 2, 3, 4] >>> x [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4, 4]>>> x y …

都在讨论高并发,结果连并发量、TPS、QPS都分不清

“ 年年岁岁跳槽季&#xff0c;回回必问高并发&#xff01;原因很简单&#xff0c;因为高并发能牵扯出太多问题&#xff0c;接口响应超时、CPU负载升高、GC频繁、死锁、大数据量存储等&#xff0c;能考察求职者的真实情况。而很多人在第一步就倒下了&#xff01;因为对数据化的…

leetcode518. 零钱兑换 II

一:题目 二:上码 class Solution { public:/**思路:1.分析题意这个满足答案的结果有很多种&#xff0c;所以我们可以用动态规划去做,那么题意中我们可以知道的是我们是可以输入一种面值的时候,我们是可以重复输入的&#xff0c;那么这就是背包类型中的完全背包了2.动态规划5步…

跟我一起学.NetCore之选项(Options)核心类型简介

前言.NetCore中提供的选项框架&#xff0c;我把其理解为配置组&#xff0c;主要是将服务中可供配置的项提取出来&#xff0c;封装成一个类型&#xff1b;从而服务可根据应用场景进行相关配置项的设置来满足需求&#xff0c;其中使用了依赖注入的形式&#xff0c;使得更加简单、…

《ASP.NET Core项目开发实战入门》送书活动结果公布

截至2020.09.20 本次送书活动《ASP.NET Core项目开发实战入门》。下面把Top 5的留言截图给大家回顾一下。以下5位同学将获赠书籍一本&#xff1a;小林子鉴静红脸先生阿星Plus以上同学请在2020年9月25日24&#xff1a;00之前加小二微信领取赠书&#xff0c;超过时间视为放弃。小…

二分查找基础概念与经典题目(Leetcode题解-Python语言)二分索引型

二分查找的定义如下&#xff08;引自Wiki&#xff09;&#xff1a; 在计算机科学中&#xff0c;二分查找算法&#xff08;英语&#xff1a;binary search algorithm&#xff09;&#xff0c;也称折半搜索算法&#xff08;英语&#xff1a;half-interval search algorithm&…