构造函数

1.构造基本概念

1.是成员函数的一种,名字与类名相同,可以有参数,不能有返回值(void也不行)

作用是对对象进行初始化,如给成员变量赋初值

2.如果定义类是没写构造函数,则编译器生成一个默认的无参数的构造函数。(不做任何操作

如果定义了构造函数,则编译器不生成默认的无参数的构造函数。

3.对象生成时构造函数自动被调用。对象一旦生成,就再也不能在其上执行构造函数。

4.一个类可以有多个构造函数。

5.为什么要构造函数?

1.构造函数执行必要的初始化工作,有了构造函数,就不必专门在写初始化函数,也不用担心忘记调用初始化函数。

2.有时对象没有被初始化就使用,会导致程序出错。

2.构造函数在数组中的使用

3.复制构造函数

1.只有一个参数,即对同类对象的引用

形如形如类名::类名(类名&)类名::类名(const 类名&)二者选一,后者能以常量对象做参数。(常选后者

如果没用定义复制构造函数,那么编译器生成默认复制构造函数。

默认的复制构造函数完成复制功能。

如果定义自己的复制构造函数,则默认的复制构造函数不存在。

不允许有形如X::X(X)的构造函数

编写复制构造函数

当我们自己编写了复制构造函数之后,编译器将不再生成默认的复制构造函数。如下面的例子所示:

对于上面的类,在复制构造函数被调用的时候将完成复制的工作,并且向控制台输出调用复制构造函数!!,假设我们有如下的初始化:

得到结果是:

错误用法

复制构造函数的参数一定要是对同类对象的引用,不能为其它的。

如上所示,我们错误的将参数Complex& c写为了Complex c,此时我们的编译将无法通过

总之,复制构造函数的参数一定要是同类对象的引用.

4.复制构造函数起作用的三种情况

1.用一个对象来初始化正在构造的对象变量

当我们用同类的一个对象去初始化另一个对象时,会导致构造函数被调用。

2.函数的参数为类的对象时

如果某函数有一个参数是类的对象,那么该函数被调用时,该类的复制构造函数将被调用。

其中我们定义了一个函数fun(Complex c),其参数为一个Complex对象,当我们在调用fun(Complex c)的时候,形参c将被初始化,此时将调用复制构造函数完成初始化工作,产生如下的输出:调用复制构造函数!!

需要注意的是,如果函数的参数为对象的引用或常引用时,将不会导致构造函数被调用,如下所示:void fun(Complex &c){}

3.函数的返回值是类的对象时

函数fun()返回一个Complex类的对象,在调用fun()函数时会导致复制构造函数被调用。

优化

当对象作为函数参数,在对函数进行调用时会调用复制构造函数对形参进行初始化工作,此时会产生额外的开销,我们可以将函数的参数写为对象的引用来避免额外的开销,如果担心对象的值在函数中会被改变,我们也可以用常引用的方式。

Complex fun(Complex c){}

我们可以写成:
Complex fun(Complex& c){}
Complex fun(const Complex& c) {}

5.类型转换构造函数

定义:1.有且仅有一个参数

2.参数是基本类型

3.转换构造函数的参数类型是其它类型

1,类型转换函数主要功能就是做类型转换,类型转换是将一个数据从 A 类型转换  到 B 类型,有隐式类型转换和强制类型转换两种;

输出结果:

ui 为 unsigned int 类型, i 为 int 类型,将两者进行相加编译器会进行隐式的类型转换,全部变成 unsigned int 类型,所以最后的运行结果是正数。

这里其实发生了我们该才说的利用了转换构造函数,把6转换成Test(6),而这样写就会产生一临时对象,所以就可以进行复制了;但是在现在的技术发在中,肯定是不希望出现这种要人去防止这隐式转换;所以在c++中有了新技术来防止出现隐式转换:

工程中通过explicit关键字杜绝编译器的转换尝试

转换构造函数被explict修饰只能进行显示转换(强制类型转换)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在 Docker 中启动 ROS2 里的 rivz2 和 rqt 出现错误的解决方法

1. 出现错误: 运行 ros2 run rivz2 rivz2 ,报错如下 : No protocol specified qt.qpa.xcb: could not connect to display :1 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was f…

debian12 - openssh-9.6.P1的编译安装

文章目录 debian12 - openssh-9.6.P1的编译安装概述笔记备注END debian12 - openssh-9.6.P1的编译安装 概述 在debian12上, 源码编译安装了openssl3.2 导致ssh失败. lostspeeddebian12d4x64:~$ openssl version OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2…

金融信贷风控系统设计

前言 近一年多以来在金融行业负责风控系统,根据自己工作中的经验,写下这篇文章。既是对自己在风控领域工作的总结,也是给刚入行和准备入行的朋友打个样,希望能有所帮助。 为什么要有风控系统 记得 2016 年信贷行业的发展形势还…

计算机毕业设计 基于SpringBoot的城市垃圾分类管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

深入解析 Spring 事务机制

当构建复杂的企业级应用程序时,数据一致性和可靠性是至关重要的。Spring 框架提供了强大而灵活的事务管理机制,成为开发者处理事务的首选工具。本文将深入探讨 Spring 事务的使用和原理,为大家提供全面的了解和实际应用的指导。 本文概览 首…

​​​​​​​CleanMyMac X有什么优势?到底好不好用?

当你的Mac开始变得缓慢或者存储空间告急时,这通常是一个清理磁盘空间的信号。无论是工作文件、个人照片、还是各种应用程序,随着时间的推移,它们都可能在你的硬盘上积累了大量数据。有效地管理这些文件不仅可以提高你的工作效率,还…

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(二)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现,还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

Android 11 访问 Android/data/或者getExternalCacheDir() 非root方式

前言: 需求要求安装三方应用ExternalCacheDir()下载下来的apk文件。 getExternalCacheDir() : /storage/emulated/0/Android/data/com../cache/ 获取访问权限 如果手机安卓版本为Android10的时候,可以在AndroidManifest.xml中添加下列代码 android:requestLegacyExt…

飞天使-k8s知识点16-kubernetes实操1-pod

文章目录 深入Pod 创建Pod:配置文件详解写个pod的yaml 文件深入Pod 探针:探针技术详解 深入Pod 创建Pod:配置文件详解 资源清单参考链接:https://juejin.cn/post/6844904078909128712写个pod的yaml 文件 apiVersion: v1 kind: P…

【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站,并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域,在数据分析、商业领域都得到了大规模的应用。 URL 每一个URL指向一个资源,可以是一个html页面,一…

IP地址如何保护网络安全

面对网络攻击时,仅依靠常态化的网络安全防御系统已捉襟见肘,如联合使用IP地址数据可以形成多元化的安全解决方案,全面监控网络活动,发现潜在威胁,制定有针对性的应对措施。 网络攻击追踪 当网站或应用遭受DDoS等网络攻…

目标识别,跟踪模块

Tofu5m 是高性价比目标识别跟踪模块,支持可见光视频或红外网络视频的输入,支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能,提供多机版与触控版管理软件,为二次…

游戏服务器多少钱一台?腾讯云32元,阿里云26元

游戏服务器租用多少钱一年?1个月游戏服务器费用多少?阿里云游戏服务器26元1个月、腾讯云游戏服务器32元,游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选,可以选择轻量应用服务器和云服务器,阿腾云atengyu…

开启一个服务,将服务器指定的文件读取,传播到网上其他终端

from flask import Flask, render_template_string app Flask(__name__)app.route(/get-data) def get_data():# 读取data.txt文件的内容with open(r./2024/2/4/data.txt, r) as file:data file.read()print(data)# 返回数据的HTML表示return render_template_string(<div…

程序员的数字化工作台:理解不关机背后的逻辑与需求

目录 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a; 工作流程与需求&#xff1a; 数据安全与备份&#xff1a; 即时性与响应&#xff1a; 个人习惯等方面&#xff1a; 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a;…

【JSON2WEB】04 amis低代码前端框架介绍

1 什么是 amis amis 是一个低代码前端框架&#xff0c;它使用 JSON 配置来生成页面&#xff0c;可以减少页面开发工作量&#xff0c;极大提升效率。 看到amis一句话的介绍&#xff0c;感觉就是JSON2WEB要找的前端框架。 amis是百度开源的框架&#xff0c;毕竟是大厂&#xff0c…

JavaScript入门学习

JavaScript 一.什么是JavaScript与作用 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言 嵌入HTML中&#xff0c;与Css一样。对浏览器事件作出响应操作HTML元素及节点。可以动态操作CSS样式。在数据被提交…

操作系统基础:磁盘组织与管理【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f6e0;️1 磁盘的结构&#x1f4e1;1.1 总览&#x1f4e1;1.2 磁盘、磁道、扇区⚗️1.2.1 什么是磁盘⚗️1.2.2 什么是磁道⚗️1.2.3 什么是扇区 &#x1f4e1;1.3 …

使用No-SQL数据库支持连接查询用例的讨论

简介 在本文中&#xff0c;我们将简单介绍什么是No-SQL数据库。然后我们会讨论一种使用关系数据库比较容易实现的查询&#xff0c;即连接查询&#xff0c;怎么样使用No-SQL来实现。 什么是No-SQL数据库 与No-SQL数据库相对应的是传统的关系数据库&#xff08;RDBMS&#xff…

【教程】Linux使用git自动备份和使用支持文件恢复的rm命令

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 首先非常不幸地告诉你&#xff1a;Linux 系统的标准 rm 命令不支持文件恢复功能。一旦使用 rm 删除了文件或目录&#xff0c;它们就会从文件系统中永久删除&#xff0c;除非你使用专门的文件恢复工具尝试…