20240416,深拷贝浅拷贝,对象初始化和清理,对象模型和THIS指针

 哈哈哈乌龟越狱了

目录

2.5 深拷贝&浅拷贝

2.6 初始化列表

2.7 类对象作为类成员

2.8 静态成员

2.9 成员变量和成员函数分开存储

2.10 THIS指针的用途

2.11 空指针访问成员函数

2.12 COSNT修饰成员函数

2.5 深拷贝&浅拷贝

浅拷贝:简单的赋值拷贝炒作
深拷贝:在堆区重新申请空间进行拷贝操作

浅拷贝带来的问题就是堆区的内存重复释放;深拷贝是?拷贝的时候重新申请一块内存,记录的数据是一样的,指向的内存是不一样的?

20240411,内存分区模型,new-delete语句-CSDN博客(一些根本不复习学了就忘还找不到笔记人士,乐,还好学的不多?/不是)

如果属性在堆区开辟的,一定要自己构造深拷贝函数避免出现问题

#include<iostream>
using namespace std;
class Person
{
public:int m_age;int* m_height;//指针接收Person(){cout << "Persong 默认构造 函数的调用" << endl;}Person(int age,int height){m_age = age;m_height=new int(height);//把身高创建在堆区,new返回的是该数据类型的指针cout << "Persong 有参构造 函数的调用" << endl;}//系统提供的拷贝函数是浅拷贝//自己写一个深拷贝构造函数,解决深拷贝带来的问题Person(const Person &p){m_age = p.m_age;//m_height = p.m_height;编译器写的m_height = new int(*p.m_height);//在堆区申请一块区域,记录*p_height的内容,即,在堆区创建数据*p_hright//此时new int(height)没有释放cout << "Persong 拷贝构造 函数的调用" << endl;}~Person(){if (m_height != NULL){delete m_height;//释放m_height = NULL;//初始化}cout << "Persong 默认析构 函数的调用" << endl;//将堆区开辟的数据做释放操作}
};
void test01()
{Person p1(28,180);//执行了一次析构函数,指针指向的内存已经被释放掉了cout << "p1的年龄为" << p1.m_age <<"身高为"<<*p1.m_height << endl;Person p2(p1);//拷贝了m_height记录的地址,此时m_height不为空,//但是地址指向的地方已经被释放了,再进行一次释放,非法操作cout << "p2的年龄为" << p2.m_age << "身高为" << *p2.m_height << endl;//函数结束一起释放
}
int main()
{test01();system("pause");return 0;
}
2.6 初始化列表

构造函数():属性1(值 1),属性2(值2)···{ }
构造函数(int a ,int b ,```):属性1(a),属性2(b)···{ }

#include<iostream>
using namespace std;
class Person
{
public:int m_a;int m_b;int m_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){}//可以修改
};
void test01()
{Person p;Person p1(540, 23, 45);//int a=540,m_a(a)cout << p.m_a << "\t" << p.m_b << "\t" << p.m_c << endl;cout << p1.m_a << "\t" << p1.m_b << "\t" << p1.m_c << endl;
}
int main()
{test01();system("pause");return 0;
}
2.7 类对象作为类成员

俺的BUG:没有特意创建一个子对象,无法输出被嵌套的子对象
构造和析构的顺序相反

#include<iostream>
#include<string>
using namespace std;
class Phone
{
public:string m_Pname;Phone(string Pname){m_Pname = Pname;cout << "Phone的 构造函数  调用" << endl;}~Phone(){cout << "Phone的 析构函数  调用" << endl;}
};
class Person
{
public:string m_Name;Phone m_Phone;Person(string name, string phone) :m_Name(name), m_Phone(phone) {cout << "Person的 构造函数  调用" << endl;}~Person(){cout << "Person的 析构函数  调用" << endl;}//先释放PERSON的,再释放PHONE的
};
void test01()
{Person p("张三", "华为p60");cout << p.m_Name  << endl;//先构造了一个Phone类,先调用了PHONE的构造函数,再PERSON的构造函数//cout << p.m_Name << "拿了" << p.m_Phone << endl;//编译错误//说没有 操作数 能匹配<<的运算符
}
int main()
{test01();system("pause");return 0;
}
2.8 静态成员

静态成员变量:所有对象共享同一份数据,编译阶段分配内存,类内声明,类外初始化
静态成员函数:所有对象共享同一个函数,静态成员函数只能访问静态成员变量

#include<iostream>
#include<string>
using namespace std;class Person
{
public://(全局?共享),编译分配,类内声明&类外初始化(否则无法访问)static int m_a;int m_c;static void func(){m_a = 999;//m_c = 888;//静态成员函数只能访问静态成员变量   因为所有对象共享,无法区分m_c属于哪一个对象?cout << "静态成员函数  func() 的调用" << endl;}
private://静态成员变量,函数 也有访问权限static int m_b;static void func2(){cout << "private 静态成员函数  func() 的调用" << endl;}
};
//类外初始化,初始化了之后,没有修改的情况下,就是100
int Person::m_a = 100;
int Person::m_b = 300;void test01()
{Person p;cout << p.m_a << endl;//无法解析的外部符号Person p2;cout << p2.m_a << endl;//通过对象访问p2.m_a = 200;cout << p2.m_a << endl;cout << p.m_a << endl;//输出200,P和P1共享这一个静态变量
}
void test02()
{//静态成员变量,不属于某个对象上,所有对象共享同一份数据//两种访问方式:通过对象,通过类名cout << Person::m_a << endl;//cout << Person::m_b << endl;//m_b是私有作用域,不能类外访问
}
void test03()
{//静态成员函数访问:对象,类名Person::func();Person p,p1;p.func();p1.func();//Person::func2();无权限
}
int main()
{test02();//输出100cout << endl;test01();cout << endl;test02();//输出200,cout << endl;test03();test02();system("pause");return 0;
}
2.9 成员变量和成员函数分开存储

只有非静态的变量才在对象上

#include<iostream>
#include<string>
using namespace std;class Person
{};
class Pers
{int m_a;int m_b;static int m_c;//不属于类的对象上void func(){}//也static void func2(){}//也
};
int Pers::m_c = 800;
void test01()
{Person p;cout << "size of Person p=" << sizeof(p) << endl;//空对象占用内存 1//C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置//(区分不同的空对象)每个空对象也应该有一个独一无二的内存地址
}
void test02()
{Pers p;cout << "size of Pers p=\t" << sizeof(p) << endl;//内存对齐成员变量
}
int main()
{test01();test02();system("pause");return 0;
}
2.10 THIS指针的用途

每一个非静态成员函数只会诞生一份函数实例,也就是多个同类型的对象会公用一块代码,this指针指向被调用的成员函数所属的对象
THIS指针是隐含每一个非静态成员函数内的一种指针,不需要定义,直接使用
用途:当形参和成员变量同名时,可以用THIS指针来区分;在类的非静态成员函数中返回对象本身,可以使用 RETURN *THIS

#include<iostream>
#include<string>
using namespace std;
//解决名称冲突
class Person
{
public:int age;Person(int age){//age = age;//编译器认为三个age是同一个,没有和成员变量区分开this->age = age;//this指针指向被调用的成员函数所属的对象}void Personaddage(Person& p){this->age += p.age;//两个变量的AGE相加 || 一个变量的AGE累加}//用引用来接收Person& Personaddage1(Person& p){this->age += p.age;//两个变量的AGE相加 || 一个变量的AGE累加return *this;//返回对象本身}Person Personaddage2(Person& p){//返回值this->age += p.age;return *this;}
};void test01()
{Person p1(18);cout << "p1的年龄是  " << p1.age << endl;
}
void test02()
{Person p(80);p.Personaddage(p);cout << "p的年龄是  " << p.age << endl;Person p1(2);p.Personaddage(p1);cout << "p的年龄是  " << p.age << endl;//p.Personaddage(p1).Personaddage(p1).Personaddage(p1).Personaddage(p1);//超级连加,错误,第一次函数运算完成,返回一个VOIDp.Personaddage1(p1).Personaddage1(p1).Personaddage1(p1).Personaddage1(p1);//链式编程思想cout << "p的年龄是  " << p.age << endl;p.Personaddage2(p1).Personaddage2(p1).Personaddage2(p1).Personaddage2(p1);//链式编程思想//只运算了第一次,值返回就是?复制一份?和本体值相同,但是不是本体了cout << "p的年龄是  " << p.age << endl;
}
int main()
{test01();test02();system("pause");return 0;
}
2.11 空指针访问成员函数

C++中空指针也是可以调用成员函数,但是也要注意有么有用到THIS指针
如果用到,需要加以判断保证代码的健壮性?

#include<iostream>
#include<string>
using namespace std;
//解决名称冲突
class Person
{
public:int m_age;void showPersonName(){cout << "this is Person Class" << endl;}void showPersonAge(){if (this == NULL){return;//不会走到下一步}cout << "m_age=" << m_age << endl;//cout << "m_age=" << this->m_age << endl;但是this现在是一个空指针,}
};void test01()
{Person* p = NULL;p->showPersonName();//p->showPersonAge();//报错
}int main()
{test01();system("pause");return 0;
}
2.12 COSNT修饰成员函数

成员函数后加CONST后-》常函数;常函数不可以修改成员属性,成员属性声明时加关键字MUTABLE后,常函数中依然可修改
在成员函数后加CONST,本质上修饰的时THIS指针,让指针指向的值也不可修改
常对象:声明对象前加CONST,常对象只能调用常函数

#include<iostream>
#include<string>
using namespace std;
//解决名称冲突
class Person
{
public:int m_age;//不能直接设置一个初始值,反而会报错受用未初始化的内存pmutable int m_b;//特殊变量,常函数中也可以修改void showage()const//(const) Person *const this//在成员函数后加CONST,本质上修饰的时THIS指针,让指针指向的值也不可修改{//m_age = 100;不可修改//this->m_age = 100;//this 指针的本质,指针常量,指针的指向不可修改,Person *const this//this = NULL;不可修改cout << "m_age=" << m_age << endl;m_b = 232;cout << "m_b=" << m_b << endl;//特殊变量可以修改}void func(){}
};
void test01()
{Person p;p.showage();
}
void test02()
{const Person p;//常对象//p.m_age = 1000;//不可修改p.m_b = 454;//可以修改p.showage();//常对象只能调用常函数//p.func();//不可以调用普通成员函数,因为普通成员函数可以修改属性
}
int main()
{test01();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二次封装el-carousel

我们创建了一个名为MyCarousel的组件,它接受el-carousel的一些常用属性作为props,并默认提供了一些值。我们还通过setup函数返回了所有props,以便它们可以在模板中被使用。 1.MyCarousel.vue组件 <!-- 轮播图片 --> <template><div class="carousel&q…

Django中的定时任务与后台任务队列的实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Web开发中&#xff0c;处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强…

vscode中使用rust的跳转定义时,rust-analyzer报错“未找到定义”,如何解决?

本文是关于错误解决的一个记录&#xff0c;如果你在使用vscode编写rust程序的过程中也遇到同样的错误&#xff0c;不妨一试。 我遇到的错误是&#xff0c;在编写的rust程序中想要跳转到当前变量或者函数的定义处&#xff0c;但按下F12无法跳转&#xff0c;且提示“未找到xxx定…

LoggerFactory is not a Logback

错误信息 LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.SimpleLoggerFactory loaded from file:/D:/maven/repository/org/slf4j/slf4j-simple/1.7.26/slf…

MySQL学习笔记5——函数和索引

函数和索引 一、函数1、数学函数2、字符串函数3、条件判断函数 二、索引1、索引是什么2、单字段索引3、组合索引4、总结 一、函数 MySQL提供了很多功能强大&#xff0c;而且使用起来非常方便的函数&#xff0c;包括数学函数、字符串处理函数和条件判断函数等。 1、数学函数 …

Python网络数据抓取(3):Requests

引言 在这一部分&#xff0c;我们将探讨Python的requests库&#xff0c;并且利用这个库来进行网页数据抓取。那么&#xff0c;我们为何需要这个库&#xff0c;以及怎样利用它呢&#xff1f; requests库是广受大家欢迎的一个库&#xff0c;它是下载次数最多的。这个库使我们能够…

在windows系统安裝 SQL Server 版本的最低需求

針對對應您的作業系統所要安裝的 SQL Server 版本的最低需求 具体参考&#xff1a;Windows 作業系統的 SQL Server - SQL Server | Microsoft Learn

stable-diffusion-webui安装与使用过程中的遇到的error合集

stable-diffusion-webui1.9.2踩坑安装 1. 安装过程1.1 stable-diffusion-webui1.2 在win11或win10系统安装&#xff0c;需修改两个启动脚本1.2.1 修改webui-user.bat1.2.2 修改webui.bat 1.3 双击 webui-user.bat 启动脚本1.3.1 no module xformers. Processing without on fre…

电力调度自动化中智能电网技术的应用

电力调度自动化中智能电网技术的应用 在现代电网的现代化发展和电网重组工作中起着关键作用,由于此项技术开发时间短,目前还没有形成一个相对清晰的概念,但此技术在未来的电网发展工作中的地位已得到了一些国家的认可。由于智能电网具有良好的兼容性以及交互性等优势,一经推出就…

解决方案 SHUTDOWN_STATE xmlrpclib.py line: 794 ERROR: supervisor shutting down

Supervisor操作命令 重新加载 Supervisor 配置&#xff1a; sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all这将重新读取 Supervisor 的配置文件&#xff0c;更新进程组&#xff0c;然后重启所有进程。 查看 Supervisor 日志&#xff1…

3.SpringCloud版本

1.SpringCloud与SpringBoot之间版本对应 2.服务拆分的注意事项 1.不同微服务&#xff0c;不要重复开发相同业务。 2.微服务的数据独立&#xff0c;每个微服务都有自己独立的数据库&#xff0c;不要访问其他微服务的数据库。 3.微服务可以将自己的的业务暴露为接口&#xff…

婚恋相亲红娘牵线系统源码支持微信小程序+微信公众号+H5+APP社交交友系统搭建,扩展你的社交影响力与人脉资源

当代年轻人晚婚晚育甚至不愿意结婚不愿意相亲等问题愈来愈严重了&#xff0c;但是如果抛开表现去追求本质的话&#xff0c;其实不难发现年轻人们还是会喜欢去找一些志同道合或者聊得来的异性朋友交流&#xff0c;从线上发展到线下的一个流程。 核心系统核心体系是恋爱小贴士、…

【C++】详解初始化列表,隐式类型转化,类静态成员,友元

前言 初始化列表是对构造函数内容的补充&#xff0c;小编会详细的讲解初始化列表的概念&#xff0c;特性&#xff0c;注意点。这是本篇内容的重头戏&#xff0c;小编会先提一个问题来抛砖引玉。 隐式类型转换顾名思义&#xff0c;首先它不需要主动转换&#xff0c;类似于把浮点…

redis原理篇(黑马程序员虎哥 )回忆笔记

原理&#xff0c;老师讲的真好。相见恨晚。 以下内容是按视频课程的章节安排&#xff0c;在我自己听完课之后&#xff0c;凭借记忆总结的。&#xff08;可能存在疏漏不足&#xff0c;后期补全和修正&#xff0c;同时也在这个过程巩固我自己的对于这个组件相关原理的学习&#x…

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序&#xff0c;下方应用程序输出界面显示乱码. 但正常运行无乱码&#xff1a; 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

主打国产算力 广州市通用人工智能公共算力中心项目签约

4月9日&#xff0c;第十届广州国际投资年会期间&#xff0c;企商在线&#xff08;北京&#xff09;数据技术股份有限公司与广州市增城区政府就“广州市通用人工智能公共算力中心”项目进行签约。 该项目由广州市增城区人民政府发起&#xff0c;企商在线承建。项目拟建成中国最…

RK3568 android11 修改关机弹窗界面

需要修改关机弹窗界面&#xff0c;当前界面我已经按照客户需求去掉emergency 但是客户需要按其他区域可以实现返回&#xff0c;也就是点击黑色背景取消dialog 嗑代码发现黑色布局为&#xff1a; <node index"0" text"" resource-id"com.android.…

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

CSS基础:最详细 padding的 4 种用法解析

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 We…

编写一款2D CAD/CAM软件(十四)绘制工具栏

前面的文章已经封装了数个最基本的图元&#xff0c;但是视图的呈现是基于测试数据形成的。为了尽快完善软件交互的框架和能力&#xff0c;本文将增加工具栏。 资源文件 1.首先&#xff0c;创建按钮图标。使用绘图软件构建出工具栏按钮的图标&#xff0c;绘图软件多种多样&…