C++ ——构造函数
1、作用:创建对象时,给对象的属性进行初始化
2、特点
(1)构造函数与类同名
(2)如果没有显式给出构造函数,编译器会给出默认的构造函数(参数为空,并且函数体也为空);如果给出任意的构造函数,系统默认的构造函数就不存在了
(3)有返回值,但是不写返回值类型,也不可以写void
(4)构造函数是在创建对象时自动调用
3、构造函数支持函数重载
4、构造函数也支持函数默认值
1、无参构造函数
编译器默认的构造函数:
类名(){}
#include <iostream>using namespace std;class Phone{private:string brand; //品牌string color; //颜色double price; //价格public:void play_music() {cout<<"播放音乐"<<endl;}void play_video(){cout<<"播放视频"<<endl;}//无参构造函数Phone(){cout<<"构造函数"<<endl;}};int main(){//无参构造函数Phone p1;return 0;}
2、有参构造函数
#include <iostream>using namespace std;class Phone{private:string brand; //品牌string color; //颜色double price; //价格public:void play_music() {cout<<"播放音乐"<<endl;}void play_video(){cout<<"播放视频"<<endl;}//有参构造函数Phone(string a,string b,double c=2995){brand=a;color=b;price=c;}};int main(){//有参构造函数(栈内存对象)Phone p2("vivo","红",9);//有参构造函数(堆内存对象)Phone*p3=new Phone("oppo","蓝",4);delete p3;p3=NULL;return 0;}
3、构造初始化列表
构造初始化列表:就是构造函数的一种简便写法
注意:构造初始化列表与构造函数不能同时出现
#include <iostream>using namespace std;class Person{private:int id;string name;string sex;bool flag;public://构造初始化列表Person(int id,string name,string sex,bool flag):id(id),name(name),sex(sex),flag(flag){}void show(){cout<<id<<name<<sex<<endl;}};int main(){Person p1(1001,"张三","男",true);p1.show();return 0;}
4、拷贝构造函数
作用:用于实现对象的拷贝创建
特点:
(1)拷贝构造函数与构造函数构成重载(拷贝构造函数也是与类同名)
(2)如果不给出拷贝构造函数,编译器会给出默认的拷贝构造函数,完成对象之间的值复制;如果给出拷贝构造函数,编译器就不会提供默认的拷贝构造函数
(3)拷贝构造函数的参数类型是对象的引用或者是const修饰的对象的引用
(4)拷贝构造函数是在拷贝创建对象时自动调用
注意:对象之间是相互独立的,对象之间的属性也是相互独立的
4.1 浅拷贝
编译器默认给出的拷贝构造函数,完成的就是浅拷贝,会完成对象之间简单的值复制
#include <iostream>using namespace std;class Person{private:int id;string name;string sex;bool flag;public://构造初始化列表Person(int id,string name,string sex,bool flag):id(id),name(name),sex(sex),flag(flag){}//编译器给出的默认的拷贝构造函数(手写出来的)----->浅拷贝Person(const Person&p){id=p.id;name=p.name;sex=p.sex;flag=p.flag;}void show(){cout<<id<<name<<sex<<endl;}};int main(){Person p1(1001,"张三","男",true); //调用有参的构造函数p1.show();// //方法一:// Person&pp=p1;// Person p2(pp);//方法二:Person p2(p1); //调用拷贝构造函数p2.show();return 0;}
默认拷贝构造函数存在安全隐患:如果成员变量是指针类型,两个对象的指针类型属性指向同一个内存空间,破坏了对象的独立性,那么这种拷贝叫浅拷贝
解决方法:使用深拷贝
4.2 深拷贝
实现方式:创建对象时,指针属性要有自己独立的区域;拷贝对象时,由地址拷贝变成内容拷贝
#include <iostream>#include <string.h>using namespace std;class Animal{private:string kind; //种类double weight; //体重char*hobby; //爱好public://构造函数---->深拷贝Animal(string k,double w,char*h){kind=k;weight=w;//创建对象时,指针属性要有自己独立的区域hobby=new char[20];strcpy(hobby,h); //使用strcpy前,需要引入string.h头文件}//展示信息void show(){cout<<"种类:"<<kind<<",体重:"<<weight<<",爱好:"<<hobby<<endl;}//kind读接口string get_kind(){return kind;}//拷贝构造函数---->深拷贝Animal(const Animal&c){kind=c.kind;weight=c.weight;//拷贝对象时,由地址拷贝变成内容拷贝hobby=new char[20];strcpy(hobby,c.hobby);}};int main(){char h[20]="eat fish";Animal cat1("小猫",12,h); //调用有参构造函数cat1.show();Animal cat2(cat1); //调用拷贝构造函数cat2.show();return 0;}
4.3 隐式调用构造函数
截止到目前,对于构造函数的调用都是显式调用
隐式调用构造函数的出现情况:
(1)等号赋值时,等号左侧是对象类型,等号右边恰好是对象构造函数所需要的参数类型,这时就会把右侧值传入到构造函数中,相当于隐式调用构造函数
#include <iostream>using namespace std;class Test{private:int number;public:Test(int number):number(number){}int get_number(){return number;}};int main(){// Test t1(100); //显示调用构造函数// cout<<t1.get_number()<<endl;// Test*t2=new Test(8); //显示调用构造函数// cout<<t2->get_number()<<endl;// delete t2;// t2=NULL;// Test t3(t1); //显示调用构造函数// cout<<t3.get_number()<<endl;Test t4=9; //隐式调用构造函数cout<<t4.get_number()<<endl;Test t5=t4; //隐式调用构造函数cout<<t5.get_number()<<endl;return 0;}
(2)隐式调用构造函数,一般在程序员不自知的情况下产生的,需要规避掉,可以用explicit关键字屏蔽
class Test{private:int number;public:explicit Test(int number):number(number){}int get_number(){return number;}};
相关文章:
C++ ——构造函数
1、作用:创建对象时,给对象的属性进行初始化 2、特点 (1)构造函数与类同名 (2)如果没有显式给出构造函数,编译器会给出默认的构造函数(参数为空,并且函数体也为空&#…...
Python实现语音识别详细教程【2025】最新教程
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程,涵盖环境搭建、使…...
【第12章:深度学习与伦理、隐私—12.4 深度学习与伦理、隐私领域的未来挑战与应对策略】
凌晨三点的自动驾驶测试场,AI系统突然在暴雨中做出惊人决策——它选择撞向隔离带而不是紧急变道,因为算法推演发现隔离带后的应急车道站着五个工程师。这个惊悚的伦理困境,揭开了深度学习伦理危机最尖锐的冰山一角。 一、潘多拉魔盒已开:深度学习伦理的四大原罪 1.1 数据原…...
Django中数据库迁移命令
在 Django 中,数据库迁移是确保数据库结构与 Django 模型定义保持一致的重要过程。以下是 Django 中常用的数据库迁移命令: 1. python manage.py makemigrations 功能:此命令用于根据 Django 项目的模型文件(models.pyÿ…...
Win11 远程 连接 Ubuntu20.04(局域网)
Win11 远程 连接 Ubuntu20.04(局域网) 0. Ubuntu 开启共享1. Ubuntu系统中安装RDP服务器2.windows中连接使用方式1:远程桌面连接(winr: mstsc)方式2:mobaXterm 3 问题远程连接后出现黑屏 参考文献: 0. Ubuntu 开启共享 在ubunt设置中&#x…...
安卓手游内存call综合工具/内部call/安卓注入call/数据分析(类人猿学院)
进程分析注入综合工具总界面 模块分析函数分析遍历 函数分析 so汇编分析 汇编call植入器,支持模拟器x86 x64 和手机arm64指令全平台 防ce搜索数据功能 全国首套发布,阿凡老师学院最好的安卓内存逆向老师,几乎行业最强的,有兴趣可以…...
PPT工具集
PPT模版 免费下载 爱PPT优品PPTPPT之家第一PPTOfficePlus部分免费 AI生成PPT Kimi秘塔搜索 可以输入内容生成PPT大纲。...
SpringBoot:使用spring-boot-test对web应用做单元测试时如何测试Filter?
对SpringBoot的Web应用做单元测试时,一般会使用spring-boot-test,pom.xml中会添加如下内容: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><…...
解锁 Java 回调函数:异步编程与事件处理的利器
什么是 Java 回调函数 在 Java 中,回调函数是一种编程模式,允许将一个方法作为参数传递给另一个方法,当某个特定事件发生或某个任务完成时,调用该方法。回调机制可以使代码更加灵活和可扩展,因为它允许在运行时动态地…...
记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-Web.IIS.Administration解读(5)
本文是记录PasteSpider的Windows.IIS开发过程, 在应用开发中,结果很重要,但是开发过程中遇到的问题和思考绝对是更有意义的事情! 经历过不同的需求后,你会发觉案例项目还真的只是案例项目,和实际项目天差地别!!! PasteSpider是开发者专属部署工具, 新版本的支持Windo…...
MySQL Workbench安装教程以及菜单汉化
WorkBench的下载 直接给下载MySql WorkBench的链接,直接进入正题:MySQL :: Download MySQL Workbenchhttps://dev.mysql.com/downloads/workbench/进入了下载界面: (安装路径自己看着办,注意安装路径不能有中文&#…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(ClearDiagnosticInformation0x14服务) 作者:车端域控测试工程师 更新日期:2025年02月13日 关键词:UDS协议、0x14服务、DTC清除、ISO 14229-1:2023、ECU测试 一、服务功能…...
Python的imutils库详细介绍
imutils 是一个专为简化OpenCV(计算机视觉库)常见操作而设计的Python工具库,提供了一系列便捷函数,使图像和视频处理更加高效和简洁。以下是对其功能、安装及用法的详细介绍: 1. 安装方法 通过pip安装: p…...
常用查找算法整理(顺序查找、二分查找、插值查找、斐波那契查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)
常用的查找算法: 顺序查找:最简单的查找算法,适用于无序或数据量小的情况,逐个元素比较查找目标值。二分查找:要求数据有序,通过不断比较中间元素与目标值,将查找范围缩小一半,效率…...
2526考研资料分享 百度网盘
通过网盘分享的文件:01、2026【考研数学】 链接:https://pan.baidu.com/s/1PwMzp_yCYqjBqa7492mP3w?pwd98wg 提取码:98wg--来自百度网盘超级会员v3的分享 通过网盘分享的文件:01、2026【考研政治】 链接:https://pan.baidu.com/s/1PwMzp_yCYqjBqa7492…...
网络编程(24)——实现带参数的http-get请求
文章目录 二十四、day241. char 转为16进制2. 16进制转为 char3. URL 编码函数4. URL 解码函数5. 实现 get 请求参数的解析6. 测试 二十四、day24 我们在前文通过beast实现了http服务器的简单搭建,但是有很多问题我们并没有解决。 在前文中,我们的 get…...
东方财富股吧发帖与评论爬虫
东方财富股吧发帖与评论爬虫 东方财富股吧爬虫 写在开头项目介绍主要功能文件介绍爬取逻辑 a. 爬取帖子信息b. 爬取评论信息 使用步骤 1. 下载代码2. MongoDB 安装3. Webdriver 安装4. 运行 main.py5. 查看数据 踩过的坑附录(运行结果) 东方财富股吧爬…...
【Elasticsearch】match_bool_prefix查询
match_bool_prefix查询是 Elasticsearch 中一种用于全文搜索的查询方式,适用于需要同时匹配多个词汇,但词汇顺序不固定的情况,它结合了布尔查询(bool)和前缀查询(prefix)的功能,适用…...
微信小程序image组件mode属性详解
今天学习微信小程序开发的image组件,mode属性的属性值不少,一开始有点整不明白。后来从网上下载了一张图片,把每个属性都试验了一番,总算明白了。现总结归纳如下: 1.使用scaleToFill。这是mode的默认值,sc…...
数据结构:最小生成树
1.基本概念 生成树:连通无向图的生成树是包含图中所有顶点的极小连通子图(无环)。 最小生成树:所有生成树中边权重总和最小的那棵。 2.常用算法 克鲁斯卡尔算法(Kruskal) 步骤: 将所有边按权…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
