构造函数和析构函数(个人学习笔记黑马学习)
- 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
- 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
#include <iostream> using namespace std;//对象初始化和清理class Person { public: //1、构造函数 进行初始化操作//构造函数//没有返回值 不用写void//函数名 与类名相同//构造函数可以有参数 可以发生重载//创建对象的时候,构造函数会自动调用,而且只调用一次Person() {cout << "Person 构造函数的调用" << endl;}//2、析构函数 进行清理操作//没有返回值 不写void//函数名和类名相同 在名称前加~//析构函数不可以有参数的,不可以发生重载//对象在销毁前 会自动调用析构函数,而且只会调用一次~Person() {cout << "Person 的析构函数调用" << endl;} };void test01() {Person p;//在栈上的数据,test01执行完毕后,释放这个对象 }int main() {//test01();Person p;system("pause");return 0; }
1、构造函数
构造函数语法: 类名(){}
1.造函数,没有返回值也不写yoid
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次构造函数的分类及调用
#include <iostream> using namespace std;//1、构造函数的分类及调用 //分类 //按照参数分类 无参构造(默认构造) 有参构造 //按照类型分类 普通构造 拷贝构造 class Person { public://构造函数Person() {cout << "Person 的无参构造函数调用" << endl;}Person(int a) {age = a;cout << "Person 的有参构造函数调用" << endl;}//拷贝构造函数Person(const Person &p) {//将传入的人身上的所有属性,拷贝到我身上cout << "Person 的拷贝构造函数调用" << endl;age = p.age;}~Person() {cout << "Person 的析构函数调用" << endl;}int age; };//调用 void test01() {//1、括号法//Person p1;//默认构造函数调用//Person p2(10);//有参构造函数调用//Person p3(p2);//拷贝构造函数调用//cout << "p2的年龄为:" << p2.age << endl;//cout << "p3的年龄为:" << p3.age << endl;//注意事项1//调用默认构造函数时候,不要加()//因为下面这行代码,编译器认为是一个函数的声明,不会认为在创建对象//Person p1();//2、显示法//Person p1;//Person p2 = Person(10);//有参构造//Person p3 = Person(p2);//拷贝构造//Person(10);//匿名对象 特点:当前执行结束后,系统会立即回收匿名对象//cout << "aaaa" << endl;//注意事项2//不要利用拷贝构造函数 初始化匿名对象 编译器会认为Person(p3)=== Person p3;对象声明/*Person(p3);*///3、隐式转换法Person p4 = 10;//相当于写了 Person p4=Person(10); 有参构造、Person p5 = p4;//拷贝构造 }int main() {test01();system("pause");return 0; }
拷贝构造函数调用时机
C++中拷贝构造函数调用时机通常有三种情况
- 使用一个已经创建完毕的对象来初始化一个新对象
- 值传递的方式给函数参数传值
- 以值方式返回局部对象
#include <iostream> using namespace std;class Person { public:Person() {cout << "Person默认构造函数调用" << endl;;}Person(int age) {cout << "Person有参构造函数调用" << endl;;m_Age = age;}Person(const Person &p) {cout << "Person拷贝构造函数调用" << endl;;m_Age = p.m_Age;}~Person() {cout << "Person析构函数调用"<<endl;}int m_Age; };//1、使用一个已经创建完毕的对象来初始化一个新对象 void test01() {Person p1(10);Person p2(p1); } //2、值传递的方式给函数参数传值 void doWork(Person p) {} void test02() {Person p;doWork(p); } //3、以值方式返回局部对象 Person doWork2() {Person p1;return p1; } void test03() {Person p = doWork2(); }int main() {//test01();//test02();test03();system("pause");return 0; }
构造函数调用规则
默认情况下,c++编译器至少给一个类添加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝构造函数调用规则如下:
- 如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义拷贝构造函数,c++不会再提供其他构造函数
#include <iostream> using namespace std;class Person { public:/*Person() {cout << "Person默认构造函数调用" << endl;;}*/Person(int age) {cout << "Person有参构造函数调用" << endl;;m_Age = age;}/*Person(const Person &p) {cout << "Person拷贝构造函数调用" << endl;;m_Age = p.m_Age;}*/~Person() {cout << "Person析构函数调用"<<endl;}int m_Age; };//void test01() { // Person p; // p.m_Age = 18; // // Person p2(p); // cout << "p2的年龄为:" << p.m_Age << endl; //}void test02() {Person p(28);Person p2(p);cout << "p2的年龄为:" << p.m_Age << endl; }int main() {//test01();test02();system("pause");return 0; }
深拷贝与浅拷贝
浅拷贝: 简单的赋值拷贝操作
深拷贝: 在堆区重新申请空间,进行拷贝操作#include <iostream> using namespace std;class Person { public:Person() {cout << "Person默认构造函数调用" << endl;;}Person(int age,int height) {m_Age = age;m_Height = new int(height);cout << "Person有参构造函数调用" << endl;;}//自己实现拷贝构造函数 解决浅拷贝带来的问题 堆区二次重复释放Person(const Person& p) {cout << "Person 拷贝构造函数的低调用" << endl;m_Age = p.m_Age;//编译器默认实现这行代码m_Height = p.m_Height;//编译器默认实现这行代码,所有导致堆区重复释放//用深拷贝解决上述问题m_Height=new int(*p.m_Height);}~Person() {//析构代码,将堆区开辟数据做释放操作if (m_Height != NULL) {delete m_Height;m_Height = NULL;}cout << "Person析构函数调用"<<endl;}int m_Age;int *m_Height; };void test01() {Person p1(18,160);cout << "p1的年龄为:"<<p1.m_Age <<" 身高为:"<<*p1.m_Height<< endl;Person p2(p1);cout << "p2的年龄为:" << p2.m_Age << " 身高为:" << *p2.m_Height << endl; }int main() {test01();system("pause");return 0; }总结: 如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
初始化列表
#include <iostream> using namespace std;class Person { public://传统初始化操作//Person(int a, int b, int c) {// m_A = a;// m_B = b;// m_C = c;//}//初始化列表初始化属性/*Person() :m_A(10), m_B(20), m_C(30) {}*/Person(int a,int b,int c) :m_A(a), m_B(b), m_C(c) {}int m_A;int m_B;int m_C; };void test01() {//Person p(10, 20, 30);//Person p;Person p(30,20,10);cout << "m_A = " << p.m_A << endl;cout << "m_B = " << p.m_B << endl;cout << "m_C = " << p.m_C << endl;}int main() {test01();system("pause");return 0; }
类对象作为类成员
#include <iostream> using namespace std; #include <string>//手机类 class Phone { public:Phone(string pName) {cout << "Phone构造函数的调用" << endl;m_PName = pName;}~Phone() {cout << "Phoen析构函数调用" << endl;}string m_PName; };//人类 class Person { public:Person(string name, string pName) :m_Name(name),m_Phone(pName){cout << "Person的构造函数调用" << endl;}~Person() {cout << "Person的析构函数调用" << endl;}//姓名string m_Name;//手机Phone m_Phone; };//当其他类对象作为本类成员,构造时候先构造类对象,再构造自身 ,析构顺序与构造相反 void test01() {Person p("张三", "苹果MAX");cout << p.m_Name << "拿着" << p.m_Phone.m_PName << endl; }int main() {test01();system("pause");return 0; }
2、析构函数
析构函数语法:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号~
3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
相关文章:
构造函数和析构函数(个人学习笔记黑马学习)
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。 #include <iostream> using namespace std;//对象初始化和清理class…...
GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图教程
详情点击链接:GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图教程 前沿 GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。 如在科研编程、绘图领域: 1、编程建议和示例代码: 无论你使用的编程语言是…...
Git上传新项目
第一步:初始化 Git 仓库 首先,打开终端或命令行界面,然后导航到项目目录。运行下面的命令来初始化一个新的 Git 仓库: git init这将创建一个新的 .git 子目录,其中包含了初始化的 Git 仓库。 第二步:添加…...
C语言文件操作总结
目录 字符方式读入文件 数据块方式读写文件 文件定位与随机读写 文件中数据的修改 字符方式读入文件 1.向文件中写入(输入字符) 用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去。 int fputc(int ch,FILE * fp) ch 是要输出的字符&#…...
原生js之dom如何进行事件监听(事件捕获/冒泡)
那么好,这次主要讲解的就是dom是如何进行事件监听和事件取消监听的,我们知道vue中主要用watch来进行监听. js监听与取消监听 那么原生js主要用到的就是addListenEvent事件来进行监听,可以监听文档dom对象也可以监听浏览器bom对象,监听事件的语法结构如下 Dom/Bom监听 eleme…...
使用SimPowerSystems并网光伏阵列研究(Simulink实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
BUUCTF-WEB-[ACTF2020 新生赛]Includel
打开靶机 点击tips 利用Burp抓包,未见异常 但发现了响应头是 PHP/7.3.13 想到了"php://input"伪协议POST发送PHP代码 构建Payload:?filephp://filter/readconvert.base64-encode/resourceflag.php 这里需要注意的是使用php://filter伪协议…...
算法通关村十四关:白银挑战-堆能高效解决的经典问题
白银挑战-堆能高效解决的经典问题 1.在数组中找第K大的元素 LeetCode215 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 思路分析 主要解决方法有3个,选择法,堆查找法和快速排序法 方法1:选择法 先遍历一遍找到最大的…...
跨站请求伪造(CSRF)攻击与防御原理
跨站请求伪造(CSRF) 1.1 CSRF原理 1.1.1 基本概念 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&a…...
从0到1实现播放控制器
这系列文章主要讲诉如何从0到1使用QT实现带时间显示、滚动字幕等的自定义配置视频播放控制器。平时我们乘坐地铁经常看到各条线的播放控制器都大同小异。其实都是通过QT等界面开发软件来实现的。 在具体开发之前,需要明确我们需要做什么? 1. 开发一个可…...
【Vue-Element-Admin】导出el-table全部数据
背景 因为el-table实现了分页查询,所以想要实现el-table需要重新编写一个查询全部数据的方法 查询全部数据 listQuery: export default{return{listQuery:{//page:1,//limit:20,//如果想兼容按条件导出,可以定义查询条件age:undefined,sex:undefined…...
MFC 更改控件的大小和位置
获取当前主窗体的位置rect CRect dlgNow;GetWindowRect(&dlgNow);获取某一个控件当前的位置 CRect rect;CButton* pBtn (CButton*)GetDlgItem(IDC_BUTTONXXX);//获取按钮控件pBtn->GetWindowRect(rect);CWnd* pWnd(CWnd*)GetDlgItem(IDC_EDITXXX);//其它控件࿰…...
【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)
目录 简介安装方法安装OpenBLAS安装lapack编译Faiss 代码示例余弦相似度计算输出ID号而非索引的改进版 简介 Faiss 是一个强大的向量相似度搜索库,具有以下优点: 高效的搜索性能:Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索…...
教育培训小程序的设计与功能解析
随着互联网的发展,线上教育逐渐成为一种趋势,越来越多的人开始选择在线学习。而搭建一个适合自己的线上教育小程序,可以为教育机构或个人提供更好的教学和学习体验。在本文中,我们将介绍如何通过一个第三方制作平台来搭建在线教育…...
【ES】illegal_argument_exception“,“reason“:“Result window is too large
查询ES数据返回错误: {"root_cause":[{"type":"illegal_argument_exception","reason":"Result window is too large, from size must be less than or equal to: [10000] but was [999999]. See the scroll api for…...
SpringBoot实现登录拦截
如果我们不进行登录拦截的话,即使我们跳过登录页面直接去访问任意一个页面也能访问成功,那么登录功能就没有意义,同时也会存在安全问题,因为有些操作是要用户登录后才能执行的,如果用户没有登录,该接口就获…...
浅谈泛在电力物联网、能源互联网与虚拟电厂
导读:从能源互联网推进受阻,到泛在电力物联网名噪一时,到虚拟电厂再次走向火爆,能源领域亟需更进一步的数智化发展。如今,随着新型电力系统建设推进,虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…...
深度学习框架安装与配置指南:PyTorch和TensorFlow详细教程
如何安装和配置深度学习框架PyTorch和TensorFlow 为什么选择PyTorch和TensorFlow?PyTorchTensorFlow安装PyTorch 步骤1:安装Python步骤2:使用pip安装PyTorch 安装TensorFlow 步骤1:安装Python步骤2:使用pip安装TensorF…...
vue中属性执行顺序
vue中属性的执行顺序 在Vue 2中,组件的生命周期和数据绑定的执行顺序如下: data:首先,组件会调用 data 函数,该函数返回一个对象,该对象的属性和方法会被分配给组件的 $data。init:接下来&…...
【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)
买卖股票Ⅲ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 无语了。。。 写的很好就是怎么都过不了。。。 还是就用代码随想录的写法吧。。。 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector&…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...

