构造函数和析构函数(个人学习笔记黑马学习)
- 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
- 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
#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&…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

