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) 步骤: 将所有边按权…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
