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.rhkb.cn/news/154167.html

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

相关文章

RabbitMQ开启消息发送确认和消费手动确认

开启RabbitMQ的生产者发送消息到RabbitMQ服务端的接收确认&#xff08;ACK&#xff09;和消费者通过手动确认或者丢弃消费的消息。 通过配置 publisher-confirm-type: correlated 和publisher-returns: true开启生产者确认消息。 server:port: 8014spring:rabbitmq:username: …

Reactor网络模式

文章目录 1. 关于Reactor模式的了解2. 基于Reactor模式实现epoll ET服务器2.1 EventItem类的实现2.2 Reactor类的实现Dispatcher函数AddEvent函数DelEvent函数EnableReadWrite函数 2.3 四个回调函数的实现acceptor回调函数recver回调函数sender回调函数errorer回调函数 3. epol…

mac使⽤nginx

⽅法1&#xff1a;homebrew 默认本地已经安装homebrew&#xff1b; 安装与启动 brew install nginx 安装nginx&#xff1b; brew services start nginx 启动nginx nginx⽂件⽬录 1. nginx安装⽂件⽬录/usr/local/Cellar/nginx 2. nginx配置⽂件⽬录/usr/local/etc/nginx 3. con…

【办公-excel】两个时间相减 (二) - 带毫秒的时间进行相减操作

一、使用内部函数 1.1 效果展示 TEXT(((RIGHT(TEXT(B2,"yyyy-mm-dd hh:mm:ss.000"),LEN(TEXT(B2,"yyyy-mm-dd hh:mm:ss.000"))-FIND(".",TEXT(B2,"yyyy-mm-dd hh:mm:ss.000")))-RIGHT(TEXT(A2,"yyyy-mm-dd hh:mm:ss.000"),…

微信支付v2

文档&#xff1a; https://pay.weixin.qq.com/wiki/doc/api/index.html 微信小程序&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1 需要一个微信认证后的小程序&#xff0c;&#xff0c;还需要一个&#xff0c;在微信商户平台&#xff0c;&…

jdbc(DriverManager+Connection+Statement+ResultSet)+SQL注入+开启预编译+数据连接池

1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 2 JDBC优势 可随时替换底层数据库&#xff0c;访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC&#xff08;接口&#xf…

C++三大特性——继承(上篇)

文章目录 目录 一、继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 一、继承的概念及定义 1.1继承的概念 继承(inherita…

最新AI智能创作系统源码AI绘画系统/支持GPT联网提问/支持Prompt应用

AI绘图专业设计 不得将程序用作任何违法违纪内容&#xff0c;不要让亲人两行泪 界面部分图解构&#xff1a; 前台show&#xff1a; 前端部署&#xff1a; 安装pm2管理器 点击设置 选择v16.19.1版本-切换版本 再新建一个网站 点击设置 添加反向代理-代理名称随便…

[MongoDB]-权限验证管理

[MongoDB]-权限验证管理 senge | 2023年9月 背景说明&#xff1a;现有两套MongoDB副本集群给开发人员使用时未开启认证。 产生影响&#xff1a;用户若输入账号以及密码则会进行校验&#xff0c;但用户可以在不输入用户名和密码的情况下也可直接登录。 倘若黑客借此进行攻击勒索…

ElasticSearch 学习7 集成ik分词器

网上找了一大堆&#xff0c;很多都介绍的不详细&#xff0c;开始安装完一直报错找不到plugin-descriptor.properties&#xff0c;有些懵这个东西不应该带在里面吗&#xff0c;参考了一篇博客说新建一个这个&#xff0c;新建完可以启动&#xff0c;但是插入索引数据会报错找不到…

Mini-dashboard 和meilisearch配合使用

下载的meilisearch一般是development模式&#xff0c;内置客户端&#xff0c;修改客户端后需要重要全部编译&#xff0c;花时间太长了。前后端分离才是正道&#xff0c;客户端修改不用重新编译后端。 方法如下&#xff1a; 1、修改配置文件/etc/meilisearch.toml&#xff0c;…

FPGA实现电机霍尔编码器模块

一. 简介 想要知道直流电机的转速&#xff0c;就需要用到编码器&#xff0c;常用的编码器有霍尔和光电两种&#xff0c;但是光电编码器比较贵(性能好于霍尔)&#xff0c;所以平常的时候使用最多的是霍尔编码器了。 霍尔编码器一般有AB两相信号输出&#xff0c;默认的时候为低…

基于springboot实现家具销售电商平台管理系统项目【项目源码+论文说明】

基于springboot实现家具销售电商平台管理系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&am…

ssti 前置学习

python venv环境 可以把它想象成一个容器&#xff0c;该容器供你用来存放你的Python脚本以及安装各种Python第三方模块&#xff0c;容器里的环境和本机是完全分开的 创建venv环境安装flask #apt install python3.10-venv #cd /opt #python3 -m venv flask1 #cd /opt 选…

信息增益,经验熵和经验条件熵——决策树

目录 1.经验熵 2.经验条件熵 3.信息增益 4.增益比率 5.例子1 6.例子2 在决策树模型中&#xff0c;我们会考虑应该选择哪一个特征作为根节点最好&#xff0c;这里就用到了信息增益 通俗上讲&#xff0c;信息增益就是在做出判断时&#xff0c;该信息对你影响程度的大小。比…

SpringCloud源码探析(十)-Web消息推送

1.概述 消息推送在日常使用中的场景比较多&#xff0c;比如有人点赞了我的博客或者关注了我&#xff0c;这时我就会收到一条推送消息&#xff0c;以此来吸引我点击或者打开应用。消息推送的方式主要分为两种&#xff1a;web消息推送和移动端消息推送。它将所要发送的信息&…

剑指offer——JZ84 二叉树中和为某一值的路径(三) 解题思路与具体代码【C++】

一、题目描述与要求 二叉树中和为某一值的路径(三)_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉树root和一个整数值 sum &#xff0c;求该树有多少路径的的节点值之和等于 sum 。 1.该题路径定义不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff…

【已解决】msvcp140.dll丢失怎样修复?msvcp140.dll重新安装的解决方法

今天我要和大家分享的是关于msvcp140.dll丢失的五种不同解决方法。我们知道&#xff0c;在运行一些软件或游戏的时候&#xff0c;经常会遇到“msvcp140.dll丢失”的问题&#xff0c;这可能会影响到我们的使用体验。那么&#xff0c;面对这个问题&#xff0c;我们应该如何应对呢…

【2023研电赛】安谋科技企业命题特别奖:面向独居老人的智能居家监护系统

本文为2023年第十八届中国研究生电子设计竞赛安谋科技企业命题特别奖分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来…

Http请求响应 Ajax 过滤器

10/10/2023 近期总结&#xff1a; 最近学的后端部署&#xff0c;web服务器运行&#xff0c;各种请求响应&#xff0c;内容很多&#xff0c;学的很乱&#xff0c;还是需要好好整理&#xff0c;前面JavaSE内容还没有完全掌握&#xff0c;再加上一边刷题&#xff0c;感觉压力很大哈…