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;用户可以方便地输入目…

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…

单片机-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…

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

神经网络基础 | 给定条件下推导对应的卷积层参数 按照 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;服务启动失败…

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

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

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…

Neural networks 神经网络

发展时间线 基础概念 多层神经网络结构 神经网络中一个网络层的数学表达 TensorFlow实践 创建网络层 神经网络的创建、训练与推理 推理 推理可以理解为执行一次前向传播 前向传播 前向传播直观数学表达 前向传播直观数学表达的Python实现 前向传播向量化实现 相关数学知识…

AR智慧点巡检系统探究和技术方案设计

一、项目背景 随着工业生产规模的不断扩大和设备复杂度的提升&#xff0c;传统的人工点巡检方式效率低下、易出错&#xff0c;难以满足现代化企业对设备运行可靠性和安全性的要求。AR&#xff08;增强现实&#xff09;技术的发展为点巡检工作带来了新的解决方案&#xff0c;通…

AI如何帮助解决生活中的琐碎难题?

引言&#xff1a;AI已经融入我们的日常生活 你有没有遇到过这样的情况——早上匆忙出门却忘了带钥匙&#xff0c;到了公司才想起昨天的会议资料没有打印&#xff0c;或者下班回家还在纠结晚饭吃什么&#xff1f;这些看似微不足道的小事&#xff0c;往往让人疲惫不堪。而如今&a…

用Python绘制一只懒羊羊

目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…

form表单row中的col排列错位混乱

如图所示 form表单新增时排列整齐 编辑时就混乱 具体原因未知 解决方法&#xff1a;在el-row中加入样式 style"flex-wrap: wrap; display: flex" <el-row style"flex-wrap: wrap; display: flex">