构造函数和析构函数(个人学习笔记黑马学习)
- 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
- 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
#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&…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...