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

chatgpt/2023/9/26 14:53:18

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.exyb.cn/news/show-5312762.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

k8s证书更新,kubeadm安装的K8S证书过期后无法使用后证书更新方法

k8s证书更新 1. 查看证书过期时间 #通过文件查看证书过期时间 for item in find /etc/kubernetes/pki -maxdepth 2 -name "*.crt";do openssl x509 -in $item -text -noout| grep Not;echo $item;done #通过命令查看证书过期时间 kubeadm certs check-expirationk8…

Redis以及Java使用Redis

一、Redis的安装 Redis是一个基于内存的 key-value 结构数据库。 基于内存存储&#xff0c;读写性能高 适合存储热点数据&#xff08;热点商品、资讯、新闻&#xff09; 企业应用广泛 官网&#xff1a;https://redis.io 中文网&#xff1a;https://www.redis.net.cn/ Redis…

【docker】docker部署单机redis

目录 一、搜索redis镜像二、拉取镜像三、创建容器&#xff0c;设置端口映射四、使用外部机器连接redis 一、搜索redis镜像 docker search redis二、拉取镜像 docker pull redis:5.0三、创建容器&#xff0c;设置端口映射 docker run -id --namemy_redis -p 6379:6379 redis:…

深入解析MySQL:类型、优势与使用实例

摘要&#xff1a;本文将深入探讨MySQL数据库的类型、为何选择这种类型的数据库以及其优点。通过详细的解释、具体的示例和输出结果&#xff0c;我们将全面介绍MySQL数据库的相关知识&#xff0c;并提供最后的百十字总结。 1. 引言 MySQL是一种常用的关系型数据库管理系统&…

(4)Makefile:遍历子目录的makefile,单线程依次执行make

1、遍历子目录的makefile&#xff0c;单线程依次执行make SUBDIRS : dir1 dir2 dir3.PHONY: allall:for dir in $(SUBDIRS); do \$(MAKE) -C $$dir -j1 all || exit $$?; \donefor dir in $(SUBDIRS); do \ ... ; done&#xff1a;使用循环结构遍历 SUBDIRS 中的每个子目录&a…

汽车交流充电桩控制主板的电路设计

汽车充电桩控制主板的电路设计 你是否曾经遇到过汽车没油的问题?但是&#xff0c;随着电动汽车的普及&#xff0c;充电问题也变得越来越重要。而汽车充电桩控制板电路设计则是解决这一问题的关键。 汽车充电桩控制板电路设计包括硬件电路设计、软件电路设计和安全性设计。硬件…

FS32K144官方提供串口Bootloader对接Matlab串口烧写程序

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 前言 Bootloader升级工具&#xff1a;可用TTL、232、485&#xff08;硬件收发模式&#xff09;,其中的一种&#x…

无涯教程-jQuery - Dialog组件函数

小部件对话框函数可与JqueryUI中的小部件一起使用。对话框是在HTML页面上显示信息的一种不错的方法。对话框是一个带有标题和内容区域的浮动窗口。此窗口可以移动&#xff0c;调整大小&#xff0c;并且默认情况下可以使用" X"图标关闭。 Dialog - 语法 $( "#d…
推荐文章