3,this指针、深拷贝浅拷贝、namespace的使用

3,this指针、深拷贝浅拷贝、namespace的使用

  • 3.1this指针
  • 3.2深拷贝和浅拷贝
  • 3.3namespace的使用

3.1this指针

定义:当前类指向自己地址的常量指针
指针被const修饰,指针指向的内容不能修改

this指针-》类 对象 占不占用大小?

this指针不占用类的大小,因为是编译器去传递的

this指针-》地址 地址里面放的是什么?

存放的是对象的首地址

静态的 非静态的 静态的成员函数没办法操作this?为什么?

静态函数没办法操作this指针,因为静态成员函数是先于对象存在的,是所有对象共有的,没有this指针

为什么要设计this的存在?

看书c++对象模型 (会了解类的大小类的设计)

#include<iostream>
using namespace std;
class Student
{
public:int getAge(){return age;}Student setAge(int age){this->age = age;cout << "age:" << age << endl;return *this;}void test()//this指针地址里面存放的是什么?{cout << "this指针里面存放的地址是什么:" << this << endl;cout << "实例对象的地址为:" << &age << endl;}static void lazy(){cout << "i want to sleep" << endl;//cout << this->age << endl;//会报错}
private:int age;
};int main()
{Student s;s = s.setAge(18);cout << s.getAge() << endl;//this指针占不占用类的大小cout << sizeof(Student) << endl;//输出结果:4//this指针不占用类的大小//this指针地址里面存放的是什么?s.test();//输出结果://this指针里面存放的地址是什么:004FF95C//实例对象的地址为:004FF95C//存放的是对象的首地址//此时没有对象 this-》实例化对象首地址Student::lazy();//静态成员函数是先于对象存在的s.lazy();system("pause");return 0;
}

3.2深拷贝和浅拷贝

浅拷贝:
简单的赋值拷贝操作(编译器提供的拷贝构造函数都是浅拷贝)
浅拷贝指的是仅复制对象的指针或引用,而不复制实际数据。换句话说,两个对象共享同一块内存。当其中一个对象修改了共享数据时,另一个对象也会受到影响。在进行浅拷贝时,只是简单地进行地址的复制,而没有创建新的对象。

深拷贝:
在堆区重新申请空间,进行拷贝操作
深拷贝指的是创建一个新的对象,并复制原始对象的所有数据,包括数据本身和指向的数据。也就是说,两个对象拥有各自独立的内存空间,互不影响。在进行深拷贝时,会递归地复制对象的成员变量,确保每个对象都有自己的拷贝。

#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)//Person p1(18,160);和Person p2(p1);释放实在析构前释放,所以写在析构内{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;//利用编译器提供的拷贝函数,会做浅拷贝// p1储存的身高int*m_Height为地址,数值160在堆区中,传递给p2的也是地址//浅拷贝中,释放顺序是先进后出,p2先被释放,之后是p1,但是p2已经释放过堆区了,所以堆区被重复释放//所以浅拷贝带来的问题就是堆区的内存重复释放(非法操作)//解决的办法:浅拷贝的问题要利用深拷贝解决// 自己实现拷贝构造函数,解决浅拷贝带来的问题//重新在堆区申请一块内存,让p2的int*m_Height指向新在堆区申请的内存(地址不同了)
}
int main()
{test01();system("pause");return 0;
}

3.3namespace的使用

通过namespace命名空间区别要省的代码、函数、类
namespace 是一种用来管理命名空间的关键字。命名空间提供了一种将全局作用域划分为不同的命名区域的机制,用于避免命名冲突和提供更好的代码组织。
使用被namespace管理类、函数等时需要在前加上命名空间关键字,如下图代码中的AsetHello::

#include<iostream>
using namespace std;
namespace AsetHello//可以在命名空间内写函数、定义类、枚举
{enum EHello{Hello_A,Hello_B,};struct FAsetHello{void Init() {}void Hello() {}};class IInterface{};class FHello:public IInterface{};FHello* GetHello();
}void HelloTest() {}namespace AsetHello
{FHello* GetHello(){return NULL;}
}namespace AsetHello
{class IInterface2{};
}namespace AsetHello//写几个namespace都行
{class IInterface3{};
}
int main()
{//namespace的调用、调用枚举AsetHello::EHello o = AsetHello::EHello::Hello_A;//想要省去AsetHello需要在全局函数写using namepace AsetHello;AsetHello::EHello o1 = AsetHello::Hello_A;//和上面写法不同,表达的意思相同//调用指针AsetHello::FHello* p = new AsetHello::FHello();//调用函数AsetHello::GetHello();::HelloTest;system("pause");return 0;
}

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

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

相关文章

《MySQL 实战 45 讲》课程学习笔记(四)

深入浅出索引 索引的出现其实就是为了提高数据查询的效率&#xff0c;就像书的目录一样。 索引的常见模型 哈希表 哈希表是一种以键 - 值&#xff08;key-value&#xff09;存储数据的结构&#xff0c;我们只要输入待查找的值即 key&#xff0c;就可以找到其对应的值即 Val…

docker中涉及的挂载点总结

文章目录 1.场景描述2. 容器信息在主机上位置3. 通过docker run 命令4、通过Dockerfile创建挂载点5、容器共享卷&#xff08;挂载点&#xff09;6、最佳实践&#xff1a;数据容器 1.场景描述 在介绍VOLUME指令之前&#xff0c;我们来看下如下场景需求&#xff1a; 1&#xff…

xshell连接liunx服务器身份验证不能选择password

ssh用户身份验证不能选择password 只能用public key的解决办法 问题现象 使用密码通过Workbench或SSH方式(例如PuTTY、Xshell、SecureCRT等)远程登录ECS实例时&#xff0c;遇到服务器禁用了密码登录方式错误. 可能原因 该问题是由于SSH服务对应配置文件/etc/ssh/sshd_config中…

路由器工作原理

路由器原理 路由概述 路由&#xff1a;跨越从源主机到目标主机的一个互联网络来转发数据包的过程。&#xff08;为数据包选择路径的过程&#xff09; 作用&#xff1a;路由器是连接不同网段的。 转发依据&#xff1a; 路由表&#xff1a;路径选择全看路由表&#xff0c;根…

蓝桥杯2018省赛全球变暖dfs

全球变暖 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序 问题描述 格式输入 格式输出 输出一个整数 样例输入 样例输出 1 评测用例规模与约定 最大运行时间&#xff1a;1s最大运行内存: 256M 解析 采用dfs的方式进行搜索&#xff0c;首先输入地…

【C语言】—— __attribute__((fallthrough))

__attribute__((fallthrough)) 是一个在编译器中使用的特性&#xff0c;用于指示在 switch 语句中的 case 标签中故意省略 break 语句时的意图。它告诉编译器&#xff0c;故意省略 break 是有意为之&#xff0c;而不是出现了错误或遗漏。 当使用 switch 语句时&#xff0c;通常…

Xshell使用是出现全黑或全白问题

Xshell使用是出现全黑或全白问题&#xff0c;这是我实际遇到的问题如图。 解决方式&#xff1a; 设置字体 解决成功&#xff1a;

整理mongodb文档(一):增

个人公众号 整理mongodb文档(一):增 看前提示 本文主要用到的工具是mongodb的db管理工具-----mongo compass。 本文主要讲的是在上述工具中如何对db的增加的操作&#xff0c;对应转化为mongose里面的语句我想应该不需要我帮忙了吧。。。 选用mongose的理由也很简单&#xf…

iOS开发-使用网络特殊字体下载CGFontRef

iOS开发-使用网络特殊字体下载CoreText 在开发中遇到需要将字体下载后再显示的情况&#xff0c;这种特殊字体下载后才能正常。 一、字体下载器 在AFNetworking中添加 pod Reachability字体下载器使用AFNetworking实现将字体文件下载 代码如下 #import "SDFontDownloa…

一个监控系统的典型架构

监控系统的典型架构图&#xff0c;从左往右看&#xff0c;采集器是负责采集监控数据的&#xff0c;采集到数据之后传输给服务端&#xff0c;通常是直接写入时序库。然后就是对时序库的数据进行分析和可视化&#xff0c;分析部分最典型的就是告警规则判断&#xff0c;即图上的告…

算法leetcode|65. 有效数字(rust重拳出击)

文章目录 65. 有效数字&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 65. 有效数字&#xff1a; 有效数字&#xf…

数字转义汉字数字显示的简单研究

最近有个需求&#xff0c;需要显示汉字数字&#xff0c;比如一二三四五…这样子&#xff0c;问题看起来挺简单&#xff0c;但我没有找到有自带这样的转换的方法&#xff0c;数字转汉字数字&#xff0c;挺有意思的&#xff0c;就简单研究了一下&#xff1b; 百度了一下&#xff…

Java阶段五Day14

Java阶段五Day14 文章目录 Java阶段五Day14分布式事务整合demo案例中架构&#xff0c;代码关系发送半消息本地事务完成检查补偿购物车消费 鲁班周边环境调整前端启动介绍启动前端 直接启动的项目gateway&#xff08;网关&#xff09;login&#xff08;登录注册&#xff09;atta…

网络请求fetch

fetch()是 XMLHttpRequest 的升级版&#xff0c;用于在 JavaScript 脚本里面发出 HTTP 请求。浏览器原生提供这个对象 fetch()的功能与 XMLHttpRequest 基本相同&#xff0c;但有三个主要的差异。 与 Ajax 类似&#xff0c;Fetch 也是前后端通信的一种方式。Fetch 要比 Ajax …

JavaScript---环境对象this

环境对象&#xff1a;指的是 函数 内部特殊的变量 this&#xff0c;它代表着当前函数运行时所处的环境。每个函数都有环境对象this。函数调用的方式不同&#xff0c;this指代的对象不同。 普通函数里面this指向的是window谁调用&#xff0c;this就指向谁&#xff08;是判断thi…

React Flow

// 创建项目 npm create vitelatest my-react-flow-app -- --template react // 安装插件 npm install reactflow npm install antd // 运行项目 npm run dev 1、App.jsx import { useCallback, useState } from react; import ReactFlow, {addEdge,ReactFlowProvider,MiniMap…

享元模式——实现对象的复用

1、简介 1.1、概述 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。例如&#xff0c;在一个文本字符串中存在很多重复的字符&#xff0c;如果每个字符都用一个单独的对象来表示&#xff0c;将会占用较多的内存…

hive的metastore问题汇总

1. metastore内存飙升 1 问题 metastore内存飙升降不下来; spark集群提交的任务无法运行, 只申请到了dirver的资源; 2 原因 当Spark任务无法获取足够资源时&#xff0c;因为任务无法继续进行&#xff0c;不能将元数据从Metastore返回给任务 后&#xff0c;这些元数据暂存在…

39.手机导航

手机导航 html部分 <div class"phone"><div class"content"><img class"active" src"./static/20180529205331_yhGyf.jpeg" alt"" srcset""><img src"./static/20190214214253_hsjqw…

【leetcode】7.29记录

题目考察内容思路踩坑剑指Offer 05.替换空格(easy)字符串创建StringBuffer&#xff0c;用charAt获取每个字符并判断&#xff0c;用sb.append©添加字符&#xff0c;最后返回sb.toString()541.反转字符串 II (easy)字符串针对每种情况直接实现就行string.substring(start,en…