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

这篇具有很好参考价值的文章主要介绍了3,this指针、深拷贝浅拷贝、namespace的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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::文章来源地址https://www.toymoban.com/news/detail-617433.html

#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;
}

到了这里,关于3,this指针、深拷贝浅拷贝、namespace的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ this指针

    this指针介绍: c++中成员变量和成员函数分开存储,每一个非静态成员函数只会有一个实例,多个同类型对象共用这一个成员函数。那么代码怎么区分哪个对象调用自己呢?this指针由此应运而生。 c++通过提供对象指针,this指针。 this指针指向被调用的成员函数所属的对象 ,当

    2024年02月03日
    浏览(42)
  • C++this指针

    本文旨在讲解C++中this,以及其相关作用! this 是 C++ 中的一个,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 下面来看一下关于this这个的实例! 通过观察上述代码,在main函数内部里,当使用Init函数时, 并没有对Init函

    2024年02月09日
    浏览(37)
  • 【C++this指针详解】

    this指针详解  ❀this指针的引入  ❀this指针的特性 🍀小结🍀 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:C++初阶 🎉代码仓库:小智的代码仓库         家银们更新不易,你们的👍点赞👍和👉关注👈真的对我真重要,各位路过的友友麻

    2024年02月06日
    浏览(35)
  • 【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

    目录 1、函数指针数组 1.1、函数指针数组是什么?  1.2、函数指针数组的用途:转移表 2、扩展:指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍  3.2、回调函数的案例:qsort函数 3.2.1、回顾冒泡排序  3.2.1、什么是qsort函数? 函数指针数组 是什么?首先主语是 数

    2024年02月07日
    浏览(44)
  • C++类和对象-C++对象模型和this指针->成员变量和成员函数分开存储、this指针概念、空指针访问成员函数、const修饰成员函数

    #includeiostream using namespace std; //成员变量 和 成员函数 分开储存的 class Person { public:     Person() {         mA = 0;     }     //非静态成员变量占对象空间     int mA;     //静态成员变量不占对象空间     static int mB;     //函数也不占对象空间,所有函数共享一个函数实例

    2024年02月20日
    浏览(47)
  • 智能指针+拷贝构造+vector容器+多态引起的bug

    今天在调试一段代码的时候,VC编译提示: error C2280: “T485CommCtrlPara::T485CommCtrlPara(const T485CommCtrlPara )”: 尝试引用已删除的函数 函数执行部分如下:  看意思是这个pComm485Pro已经消亡了,后续push_back到vec485DevCommPara有问题,但智能指针已经move了,这样new出来资源的所有权应该

    2024年02月11日
    浏览(44)
  • 【C++】this 指针的概念

             欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、this 指针的用途 2.1、用途 1 2.1.1  解法 1  2.1.2  解法 2  2.2、用途 2  2.3、用途 3  3、总结          我们知道在 C++ 中成员变量和成员函数是分开

    2024年02月07日
    浏览(34)
  • c语言实现this指针效果

    由于目前在做一个比较复杂的嵌入式项目,想要借此提升一下代码的结构设计能力,所以想要以 面向对象 的思想来完成这个项目,即把每个板载外设资源视为一个对象,采用 msp+bsp 的模式,对每个bsp外设实现对象化处理,现有方案需要手动传入对象引用,调用方法时比较麻

    2024年02月05日
    浏览(75)
  • C++:初识类与this指针

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 注意类定义结束时后面分号( ; )不能省略。 类体中的内容称为类的成员: 类中的变量称为类的属性or成员变量; 类中的函数称为类的方法or成员函数; 类的两种定义方式 声明和定义全部放在类体中,需注意:

    2024年02月10日
    浏览(37)
  • C++对象模型和this指针

    ---成员变量和成员函数时分开储存的(在C++中,类内的成员变量和成员函数分开储存, 只有非静态成员变量才属于类的对象上 ) ---空对象: 用sizeof()计算类所占的空间时,只计算属于类的对象上的!!!!!!!!!!!!!!!! !!!!!!!只有非静态成员变量

    2024年04月29日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包