C++构造函数

        在本文中,您将学习C ++中的构造函数。您将学习什么是构造函数,如何创建它以及C ++中的构造函数类型。

        构造函数是成员函数的一种特殊类型,它在创建对象时会自动对其进行初始化。编译器通过其名称和返回类型将给定的成员函数标识为构造函数。构造函数与该类具有相同的名称,并且没有任何返回类型。同样,构造函数始终是公共的。

... .. ...
class temporary
{
private: int x;float y;
public:// 构造函数temporary(): x(5), y(5.5){// 构造函数体}... ..  ...
};int main()
{Temporary t1;... .. ...
}

上面的程序显示了定义的构造函数,没有返回类型,并且名称与类相同。

构造函数如何工作?

        在上面的代码中,temporary()是一个构造函数。创建类的对象时,将自动调用构造函数temporary,并将x初始化为5,然后y初始化为5.5。您还可以按以下方式初始化构造函数体内的数据成员。但是,这种不推荐使用此方法。

temporary()
{x = 5;y = 5.5;
}
// 这种方法不是首选的。

在C ++中使用构造函数

        假设您正在处理100个Person对象,并且数据成员age的默认值为0。手动初始化所有对象将是一项非常繁琐的任务。

        相反,您可以定义一个初始化age为0 的构造函数。然后,您要做的就是创建一个Person对象,构造函数将自动初始化age。这些情况在处理对象数组时经常出现。另外,如果要在创建对象后立即执行一些代码,可以将代码放在构造函数的主体内。

示例1:C ++中的构造方法

计算并显示矩形的面积。

#include <iostream>
using namespace std;class Area
{private:int length;int breadth;public:// 构造函数Area() : length(5), breadth(2) { }void GetLength(){cout << "分别输入长度和宽度: ";cin >> length >> breadth;}int AreaCalculation() { return (length * breadth); }void DisplayArea(int temp){cout << "面积: " << temp;}
};int main()
{Area A1, A2;int temp;A1.GetLength();temp = A1.AreaCalculation();A1.DisplayArea(temp);cout << endl << "不从用户那里获取值时的默认面积为:" << endl;temp = A2.AreaCalculation();A2.DisplayArea(temp);return 0;
}

输出结果: 

        在这个程序中,创建类Area来处理面积相关的函数。它有两个数据成员length和breadth。定义了一个初始化length为5和breadth为2的构造函数。我们还具有三个附加的成员函数GetLength(), AreaCalculation() 和 DisplayArea(),分别从用户处获取长度,计算面积以及显示面积。

        当创建对象A1和A2时,由于构造函数的关系,这两个对象的长度(length)和(breadth)宽度分别初始化为5和2。

        然后,调用成员函数GetLength(),该函数从用户那里获取对象A1的长度(length)和(breadth)宽度值。 这改变了对象A1的长度(length)和(breadth)宽度。

        然后,通过调用AreaCalculation()函数计算对象A1的面积,并将其存储在变量temp中,最后显示出来。

        对于对象A2,不要求用户提供任何数据。 因此,长度(length)和(breadth)宽度分别保持5和2。然后,计算并显示A2的面积为10。

 

构造函数重载

        构造函数也可以类似于函数重载的方式重载。重载的构造函数具有相同的名称(类的名称),但参数个数不同。根据传递的参数的个数和类型,将调用特定的构造函数。由于存在多个构造函数,因此在创建对象时也应传递构造函数的参数。

示例2:构造函数重载

// 源代码演示重载的构造函数的工作原理
#include <iostream>
using namespace std;class Area
{
private:int length;int breadth;public:// 无参数构造函数Area() : length(5), breadth(2) { }// 有两个参数的构造函数Area(int l, int b) : length(l), breadth(b) { }void GetLength(){cout << "分别输入长度和宽度: ";cin >> length >> breadth;}int AreaCalculation() { return length * breadth; }void DisplayArea(int temp){cout << "面积: " << temp << endl;}
};int main()
{Area A1, A2(2, 1);int temp;cout << "没有传递参数时的默认面积。" << endl;temp = A1.AreaCalculation();A1.DisplayArea(temp);cout << "(2,1)作为参数传递时的面积。" << endl;temp = A2.AreaCalculation();A2.DisplayArea(temp);return 0;
}

输出结果:

 

        对于对象A1,创建对象时不传递任何参数。因此,将调用不带参数的构造函数,该构造函数将长度(length)初始化为5,宽度(breadth)初始化为2。因此,对象A1的面积将为10。

        对于对象A2,在创建对象时将2和1作为参数传递。因此,将调用具有两个参数的构造函数,该构造函数将长度(length)初始化为l(在这种情况下为2),并将宽度(breadth)初始化为b(在这种情况下为1)。 因此,对象A2的面积将为2。

默认拷贝构造函数

        一个对象可以用另一个相同类型的对象初始化。这与将一个类的内容复制到另一个类是一样的。在上面的程序中,如果你想初始化一个对象A3,使它包含与A2相同的值,可以这样执行:

....
int main()
{Area A1, A2(2, 1);// 将A2的内容复制到A3Area A3(A2);OR, Area A3 = A2;
}

        您可能会想,您需要创建一个新的构造函数来执行这个任务。但是,不需要额外的构造函数。这是因为默认情况下,复制构造函数已经内置到所有类中。

验证代码如下:

// 源代码演示重载的构造函数的工作原理
#include <iostream>
using namespace std;class Area
{
private:int length;int breadth;public:// 无参数构造函数Area() : length(5), breadth(2) { }// 有两个参数的构造函数Area(int l, int b) : length(l), breadth(b) { }void GetLength(){cout << "分别输入长度和宽度: ";cin >> length >> breadth;}int AreaCalculation() { return length * breadth; }void DisplayArea(int temp){cout << "面积: " << temp << endl;}
};int main()
{Area A1, A2(2, 1);int temp;cout << "没有传递参数时的默认面积。" << endl;temp = A1.AreaCalculation();A1.DisplayArea(temp);cout << "A2(2,1)作为参数传递时的面积。" << endl;temp = A2.AreaCalculation();A2.DisplayArea(temp);Area A3(A2); // 或者Area A3 = A2;cout << "A3(2,1)作为参数传递时的面积。" << endl;temp = A3.AreaCalculation();A3.DisplayArea(temp);return 0;
}

输出结果: 

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

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

相关文章

各报文段格式集合

数据链路层-- MAC帧 前导码8B&#xff1a;数据链路层将封装好的MAC帧交付给物理层进行发送&#xff0c;物理层在发送MAC帧前&#xff0c;还要在前面添加8字节的前导码&#xff08;分为7字节的前同步码1字节的帧开始定界符&#xff09;MAC地址长度6B数据长度46&#xff5e;1500B…

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

防止SQL注入攻击的综合解决方案

文章目录 摘要背景和危害性防御措施示例代码&#xff08;Java&#xff09;示例代码&#xff08;PHP&#xff09;示例MySQL命令示例代码&#xff08;Python&#xff09;示例代码&#xff08;C#&#xff0c;使用Entity Framework&#xff09; 进一步防御SQL注入攻击的措施使用ORM…

【Linux】Git使用

一、Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理很小或非常大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&#xff09;&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务…

原生JS-鼠标拖动

原生JS-鼠标拖动 通过鼠标的点击事件通过h5的属性 通过鼠标的点击事件 步骤&#xff1a; 1. 鼠标按下div。 2. 鼠标移动&#xff0c;div跟着移动 原生js&#xff0c;实现拖拽效果。1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。鼠标按下的时候&#xff0c;开始监听鼠标…

【Spring框架学习3】Spring Bean的作用域 及 生命周期

一、Spring Bean的作用域有哪些&#xff1f; Spring框架支持以下五种Bean的作用域&#xff1a; Singleton&#xff1a;这是默认的作用域&#xff0c;在每个Spring IoC容器中只有一个Bean的实例(IoC初始化后)。Spring 中的 bean 默认都是单例的&#xff0c;是对单例设计模式的…

cesium图标漂移分析与解决

漂移现象如下 什么是图标漂移&#xff1f; 随着视野改变&#xff0c;图标相对于地面发生了相对位置的变化 让人感觉到图标有飘忽不定的感觉 原因分析 图标是静止的&#xff0c;它的位置在世界坐标系中是绝对的、静止的。 漂移大部分的原因是&#xff1a; 透视关系发生了错…

新华三辅导笔记 2023/10/9-2023/10/13

新华三辅导笔记 一、需要用到的软件二、计算机网络概述1、计算机网络的定义和基本功能&#xff08;1&#xff09;什么是计算机网络&#xff08;2&#xff09;计算机网络的基本功能 2、&#xff08;1&#xff09;局域网、城域网和广域网&#xff08;范围划分&#xff09;&#x…

OpenCV防抖实践及代码解析笔记

视频防抖是指用于减少摄像机运动对最终视频的影响的一系列方法。摄像机的运动可以是平移&#xff08;比如沿着x、y、z方向上的运动&#xff09;或旋转&#xff08;偏航、俯仰、翻滚&#xff09;。 正如你在上面的图片中看到的&#xff0c;在欧几里得运动模型中&#xff0c;图像…

leetcode:190. 颠倒二进制位

一、题目&#xff1a; 函数原型&#xff1a; uint32_t reverseBits(uint32_t n) 解释&#xff1a;uint32是无符号int或short的别称&#xff0c;传入的参数是一个32位二进制串&#xff0c;返回值是该32位二进制串逆序后的十进制值 二、思路&#xff1a; 实际上并不需要真的去逆…

移动应用-Android-开发指南

Android-UI开发指南 Android Studio调试UI设计UI框架布局Layout文本框 android的活动Activity基本概念Activity的生命周期Activity栈创建Activity管理ActivityActivity间传递数据 FragmentAdapterRecyclerViewRecyclerView Adapter&#xff08;适配器&#xff09;事件setOnItem…

Can 通信-协议

概述 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO国际标准化的串行通信协议。 在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种各样的电子控制系统 被开发了出来。由于…

uniapp快速入门系列(3)- CSS技巧与布局

章节三&#xff1a;CSS技巧与布局 1. uniapp中的样式编写2. 常见布局技巧与实例解析2.1 水平居中布局2.2 垂直居中布局2.3 等高布局2.4 响应式布局 3. CSS动画与过渡效果 在uniapp中&#xff0c;我们使用CSS来设置页面的样式和布局。本章将介绍一些在uniapp中常用的CSS技巧和布…

IDEA的使用(一)代码模块的导入、快捷使用、自定义 (IntelliJ IDEA 2022.1.3版本)

目录 1. IDEA项目结构 2. 模块的导入操作 2.1 正规操作 2.2 取巧操作 2.3 出现乱码 2.4 模块改名 3. 代码模板的使用 后缀补全&#xff08;Postfix Completion&#xff09;、实时模板&#xff08;Live Templates&#xff09;菜单里面什么介绍都有&#xff0c;可以自学&a…

4.02 用户中心-上传头像功能开发

详细内容请看下面地址&#xff1a; 地址&#xff1a;http://www.gxcode.top/code

林沛满-TCP 是如何避免被发送方分片的?

TCP 可以避免被发送方分片&#xff0c;是因为它主动把数据分成小段再交给网络层。最大的分段大小称为 MSS&#xff08;Maximum Segment Size&#xff09;&#xff0c;它相当于把 MTU 刨去 IP头和 TCP 头之后的大小&#xff0c;所以一个 MSS 恰好能装进一个 MTU 中。 图4 图 4 …

唐老师讲电赛

dc-dc电源布局要点

存档&改造【04】二维码操作入口设置细节自动刷新设置后的交互式网格内容的隐藏

因为数据库中没有数据无法查看设置效果&#xff0c;于是自己创建了个测试数据表&#xff0c;用来给demo测试 -- 二维码操作入口设置 create table JM_QR_CODE(QR_CODE_ID NUMBER generated as identity primary key,SYSTEM_ID NUMBER(20) not null,IS_ENAB…

iceberg简介004_iceberg和其他数据湖框架的对比---​​数据湖Apache Iceberg工作笔记0004

然后来看一下iceberg和其他数据湖框架的对比这里可以看到hudi支持的多一点对吧,但是 iceberg有自己的优势,并且他们都支持timeline 也就是时间旅行对吧. 然后这个图是显示了,数据湖三剑客的开源时间,以及火热程度,可以对比一下看看.