C++—21、C++ 中构造函数Constructors

一、什么是构造函数?

构造函数是一个特殊的方法,它在类每次实例化创建对象的时侯自动调用,用于初始化对象。

构造函数的名字必须与类名完全相同,并且没有返回类型,甚至连void也没有。

构造函数的目的是确保对象在创建时处于一个有效的、已知的状态。

二、构造函数存在的原因探讨:

1、假设我们要建一个Entity类,里面有位置信息,我们实例化后,打印出来,如下所示:

运行代码,打印出来一些随机值。

这是因为当我们实例化Entity类并且分配内存的时候,但实际上还没有对内存进行初始化,就是说内存空间还是原来的内容。

我们想做的可能就是初始化内存并把它设置为0,这样我们的位置默认就是0,而我们并不用显示的去指定一个值。

2、如果我们想手动打印X和Y,因为它们是公有的,所以我可以使用e.X直接把X打印出来。如下:

这里出现了错误,说使用未初始化的内存e和未初始化的局部变量(uninitialized local variable)e的报错信息。

换句话说,这个代码都不能通过编译,因为我们在尝试使用未初始化的内存。

上一个print函数仍然可以通过编译。但是它并没有像我们期望的那样运行,当然这是因为它在打印X和Y时被设置成随机值。

3、归纳一下

我们已经知道要做的就是需要做某种初始化。我们需要某种在我们创建Entity实例的时候就会自动把X和Y设置为0的方法,除非我们想设置为特定的值。

可能你想做的就是创建一个初始化方法。因此我们来创建一个Init方法,它的工作就是设置X和Y的值为0.

现在我能做的就是当我创建Entity的时候,调用e.Init()。然后调用print()方法尝试进行打印。

但是这样我们添加了太多的代码,我们必须定义这个Init方法,然后每当我要创建一个Enity的时候我都必须要去调用Init函数,这代码非常冗余而且一点也不清爽。如果当我们创建Entity的时候能自动运行这个初始化方法就好了,每当你创建一个对象的时候它就会被调用。

三、构造函数的定义

1、‌默认构造函数‌:

没有参数的构造函数。如果类中没有定义任何构造函数,编译器会自动生成一个默认构造函数。如果定义了其他构造函数,编译器则不会自动生成默认构造函数。

class MyClass {
public:MyClass() {// 初始化代码}
};

在Java中,基本数据类型中,比如int和float类型会默认被初始化为0,但是c++中不是这样的,你必须手动初始化所有的基本类型,不然,它们就会被设置为之前留存在内存中的值,所以非常非常重要的是,不要忘记进行初始化。还是那样,我会在以后讲解更多关于初始化和正确初始化的策略和方法。

2、参数化构造函数‌:接受一个或多个参数的构造函数。 


      让我们来看看带参数的构造函数,我门可以写多个构造函数,但是要给他们提供不同的参数,这个我写同名方法是一样的。其实这叫函数重载,就是相同的函数名有不同的参数的不同版本函数,我把x和y作为参数添加到这里,然后把x和y赋值给X和Y。

#include <iostream>class Entity
{
public:float X,Y;//用来表示Entity的位置;Entity(){X = 0.0f;Y = 0.0f;}Entity(float x,float y){X = x;Y = y;}void Print()//把位置输出到控制台{std::cout << X <<"," << Y << std::endl;}};int main()
{Entity e(10.0f,5.0f);//创建Entity的实例,e.Print();//调用print函数,运行函数
}

运行结果如下:

3、‌拷贝构造函数‌:用于创建一个对象作为另一个同类型对象的副本。

拷贝构造函数接受一个同类型对象的常量引用作为参数。如果类中没有定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。

class MyClass {
private:int* data;
public:MyClass(const MyClass& other) {// 深度拷贝代码data = new int(*other.data);}
};

4、移动构造函数‌(C++11及以后):用于“窃取”另一个对象的资源而不是复制它们,以提高效率。

移动构造函数接受一个同类型对象的右值引用作为参数。

class MyClass {
private:int* data;
public:MyClass(MyClass&& other) noexcept {data = other.data;other.data = nullptr; // 防止析构时释放资源}
};

四、注意事项

构造函数不会在你没有实例化对象的时候运行,所以如果你只是使用类的静态方法,构造函数是不会执行的。当你用new关键字创建对象实例的时候也会调用构造函数。

也有一些方法可以删除构造函数,比如说你有一个只有静态方法的Log类,就像这里的static void Log()。

我想让别人只像这样使用这个Log类,不希望别人创建实例。有两种不同的解决方法,我们可以通过设置private来隐藏构造函数。

运行你会发现,报错了,因为我不能访问构造函数。

如果不添加

private:
    Log()
    {

    }

你可以看到显然是允许构造函数构造这个对象的。

因为c++默认给我们提供了构造函数。但是我们可以对编译器说:“不,我不想要那个默认的构造函数”

这里,我们就无法调用,因为默认构造函数已经不存在了,被删除了。

还有一些特殊类型的构造函数,比如说赋值构造函数和移动构造函数。他们都比较复杂,需要单独介绍。

构造函数是一个特殊的函数,会在你每次实例化类的时候调用,最主要的用处就是来初始化类

。当你创建一个对象实例的时候,确保你初始化了所有的内存和做了所有你需要的设置。

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

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

相关文章

Tensor 基本操作1 unsqueeze, squeeze, softmax | PyTorch 深度学习实战

本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考&#xff1a;https://pytorch.org/tutorials/beginn…

C# HTTP/HTTPS 请求测试小工具

这是一个使用 C# 语言开发的实用小工具&#xff0c;旨在帮助用户轻松测试 HTTP 和 HTTPS 请求。 该工具可以发送各种 HTTP 和 HTTPS 请求&#xff0c;包括但不限于 GET、POST、PUT、DELETE 等常见的请求类型。通过简洁明了的界面或命令行操作&#xff0c;用户可以方便地输入目…

学习英语48个国际音标

学习英语48个国际音标 首先在b站刷到了雪梨老师的视频&#xff0c;感觉很好&#xff1a; 【雪梨老师】48个国际音标的标准发音速记口诀&#xff0c;零基础一定要收藏&#xff01;【建议收藏】_哔哩哔哩_bilibili 雪梨老师的视频朗朗上口&#xff0c;节奏感强&#xff0c;听起…

Kyligence AI 数据智能体:首批亮相神州数码 DC·AI 生态创新中心!

近日&#xff0c;跬智信息&#xff08;Kyligence&#xff09;长期合作伙伴神州数码&#xff0c;其 DCAI 生态创新中心正式启幕。 作为首批生态伙伴&#xff0c;Kyligence AI 数据智能体也正式入驻&#xff0c;在这里首次亮相。 Kyligence 是国内最早推出 AI 用数产品的厂商&a…

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大&#xff0c;像素点越亮。 最后的3表示三个颜色通道&#xff0c;常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…

JVM面试题解,垃圾回收之“分代回收理论”剖析

一、什么是分代回收 我们会把堆内存中的对象间隔一段时间做一次GC&#xff08;即垃圾回收&#xff09;&#xff0c;但是堆内存很大一块&#xff0c;内存布局分为新生代和老年代、其对象的特点不一样&#xff0c;所以回收的策略也应该各不相同 对于“刚出生”的新对象&#xf…

从根源分析,调试,定位和解决MacOS ld: unsupported tapi file type ‘!tapi-tbd‘ in YAML file

你要是遇到同样错误&#xff0c;找一圈都没有解决&#xff0c;建议认真读一下本文&#xff0c;这个应该是最终极的解决办法&#xff0c;从原理上剖析了产生的原因&#xff0c;同时给出来了调试和定位的办法。 maccos使用brew安装了一个gcc14, 结果编译一个最简单的程序都报错&a…

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕&#xff1a; 由无数个发光的LED灯珠按照一定的顺序排列而成&#xff0c;当需要显示内容的时候&#xff0c;点亮相关的LED灯即可&#xff0c;市场占有率很高&#xff0c;主要是用于户外&#xff0c;广告屏幕&#xff0c;成本低。 LED屏是一种用发光…

Windows cmd常用命令

文章目录 Windows cmd常用命令一、引言二、文件和目录操作1、查看和切换目录2、文件和目录的创建与删除 三、系统信息与网络配置1、系统信息2、网络配置 四、使用示例五、总结 Windows cmd常用命令 一、引言 Windows 命令提示符&#xff08;cmd&#xff09;是一个强大的工具&a…

snippets router pinia axios mock

文章目录 补充VS Code 代码片段注册自定义组件vue routerpinia删除vite创建项目时默认的文件axiosmock3.0.x版本的 viteMockServe 补充 为文章做补充&#xff1a;https://blog.csdn.net/yavlgloss/article/details/140063387 VS Code 代码片段 为当前项目创建 Snippets {&quo…

Spring MVC中HandlerInterceptor和Filter的区别

目录 一、处理阶段 二、功能范围 三、参数访问 四、配置方式 五、使用场景说明 在Spring MVC中&#xff0c;HandlerInterceptor和Filter都是用于拦截请求的重要组件&#xff0c;但它们在多个方面存在显著的差异。本文将详细解析这两种拦截机制的区别&#xff0c;并结合使用…

在K8S中,如何使用EFK实现日志的统一管理?

在Kubernetes中&#xff0c;EFK是一种常见的日志统一管理方案。EFK堆栈允许你收集、存储、搜素、分析和可视化容器应用程序的日志。下面是如何在Kubernetes中使用EFK实现日志统一管理的详细步骤&#xff1a; 部署Elasticsearch elasticsearch是一个分布式、RESTful风格的搜索…

神经网络基础 | 给定条件下推导对应的卷积层参数

神经网络基础 | 给定条件下推导对应的卷积层参数 按照 PyTorch 文档中 给定的设置&#xff1a; H o u t ⌊ H i n 2 padding [ 0 ] − dilation [ 0 ] ( kernel_size [ 0 ] − 1 ) − 1 stride [ 0 ] 1 ⌋ H_{out} \left\lfloor\frac{H_{in} 2 \times \text{padding}[0]…

欧拉(Euler 22.03)安装ProxySQL

下载离线安装包 proxysql-2.0.8-1-centos7.x86_64.rpm 链接: https://pan.baidu.com/s/1R-SJiVUEu24oNnPFlm9wRw 提取码: sa2w离线安装proxysql yum localinstall -y proxysql-2.0.8-1-centos7.x86_64.rpm 启动proxysql并检查状态 systemctl start proxysql 启动proxysql syste…

Sharding-JDBC 5.4.1+SpringBoot3.4.1+MySQL8.4.1 使用案例

最近在升级 SpringBoot 项目&#xff0c;原版本是 2.7.16&#xff0c;要升级到 3.4.0 &#xff0c;JDK 版本要从 JDK8 升级 JDK21&#xff0c;原项目中使用了 Sharding-JDBC&#xff0c;版本 4.0.0-RC1&#xff0c;在升级 SpringBoot 版本到 3.4.0 之后&#xff0c;服务启动失败…

MacOS/C/C++下怎样进行软件性能分析(CPU/GPU/Memory)

在macOS环境下进行C/C软件性能分析&#xff0c;可以使用多种工具和技术来测量和优化CPU、GPU和内存的性能。macOS提供了丰富的性能分析工具&#xff0c;如Instruments、gprof、Perf、以及NVIDIA和Intel的专用工具。下面详细介绍了实现思想和操作方法。 1. 性能分析的目标 CPU…

WPS计算机二级•幻灯片的基础操作

听说这是目录哦 PPT的正确制作步骤&#x1f6e3;️认识PPT界面布局&#x1f3dc;️PPT基础操作 快捷键&#x1f3de;️制作PPT时 常用的快捷技巧&#x1f3d9;️快速替换PPT的 文本字体&#x1f303;快速替换PPT 指定文本内容&#x1f305;能量站&#x1f61a; PPT的正确制作步…

vue3组件传值具体使用

问&#xff1a; left.vue文件调用接口获取了后端返回的urlLink字段&#xff0c;我该怎么传递给总的父组件index.vue中&#xff0c;我需要点击父组件的一个按钮来触发跳转&#xff1f; 回答&#xff1a; 在 Vue 3 中使用 TypeScript 和 setup 语法糖时&#xff0c;可以通过 e…