首页 > 系统相关 >Linux C++ 015-对象模型和this指针

Linux C++ 015-对象模型和this指针

时间:2024-04-03 09:58:41浏览次数:25  
标签:const 函数 对象 成员 C++ Person 015 Linux 指针

Linux C++ 015-对象模型和this指针

本节关键字:Linux、C++、对象模型、this指针
相关库函数:

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

1、在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上;
2、C++编译器会给每个空对象也分配一个字节的空间,是为了区分空对象占内存的位置,每个空对象也应该有一个独一无二的内存地址。
class Person
{
public:
	int m_A;
	static int m_B;//静态成员变量 不属于类对象上
	void fun() {}//非静态成员函数 不属于类对象上
	static void fun2(){}//静态成员函数 不属于类对象上
};

int Person::m_B = 0;
void test()
{
	Person p;
	//空对象占用内存空间为1
	cout << "sizeof(p) = " << sizeof(p) << endl;
}	
void test2()
{
	Person p;
	//对象占用内存空间为4
	cout << "sizeof(p) = " << sizeof(p) << endl;
}

this指针概念

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会公用一块代码。
那么,这一块代码是如何区分那个对象调用自己的呢?C++通过提供特殊的对象指针 —— this 指针,解决上述问题:

1、this 指针指向被调用的成员函数所属的对象
2、this 指针是隐含在每一个非静态成员函数内的一种指针
3、this 指针不需要定义,直接使用即可

this 指针的用途:

1、当形参和成员变量同名时,可用 this 指针来区分
2、在类的非静态成员函数中 返回对象本身,可用 return *this
class Person
 {
public:
	Person(int age)
	{
         this->age = age;
	}
	Person& PersonAddAge(Person &p)
	{
         this->age += p.age;
         //this指向p2的指针,*this指针p2的内容
         return *this;
	}
	
	int age;
};	
//1.this指针解决名称冲突
void test()
{
	Person p1(18);
	cout << "p1的年龄为:" << p1.age << endl;
}		
//2.this指针在类的非静态成员函数中 返回对象本身
void test2()
{
	Person p1(10);
	Person p2(10);
	p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
	cout << "p2的年龄为:" << endl;
}

空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到 this 指针,如果用到 this 指针,需要加以判断以保证代码的健壮性。
class Person
{
public:
	void ShowClassName()
	{
		cout << "this is Person Class" << endl;
	}
	void ShowPersonAge()
	{
		if(this == NULL)
		{
    		return ;
		}
		cout << "age = " << m_Age << endl;//m_Age == this-> m_Age
	}
	
	int m_Age;
};	
void test()
{
	Person *p = NULL;
	p->ShowClassName();
	p->ShowPersonAge();
}

const修饰成员函数

常函数:

(1)成员函数后加 const 后我们称这个函数为常函数
(2)常函数内不可以修改成员属性
(3)成员属性声明时加关键字 mutable 后,在常函数中依然可以修改

常对象:

(1)声明对象前加 const 称该对象为常对象
(2)常对象只能调用常函数
class Person
{
public:
	//this指针的本质 是指针常量  指针的指向是不可以修改的
     //const Person * const this
     //在成员函数后面加const,修饰的是this指向,让指针指向的值也不可能修改
	void ShowPerson() const
	{
		//this->m_A = 100;//错误,m_A不可被修改
		this->m_B = 100;
		cout << "m_B = " << m_B << endl;
	}
	void func(){
		
	}
	
	int m_A;
	mutable int m_B;//特殊变量,即使在常函数中,也可以修改这个值
};
void test01()
{
	Person p;
	p.ShowPerson();
}
void test02()
{
	const Person p;//在对象前加const,变为常对象
	//p.m_A = 100;//错误,常对象不能被修改
	p.m_B = 100;//正确
	//p.func();//错误,常对象不可以调用普通成员函数,因为普通成员函数可以修改属性
}

标签:const,函数,对象,成员,C++,Person,015,Linux,指针
From: https://blog.csdn.net/qq_45157350/article/details/135867574

相关文章

  • 在Linux中,有哪些虚拟化技术?
    在Linux系统中,虚拟化技术被广泛应用,旨在让一个物理服务器能够运行多个独立的虚拟机实例。以下是一些主要的Linux虚拟化技术:全虚拟化(FullVirtualization)KVM(Kernel-basedVirtualMachine):KVM是Linux内核模块,它将Linux本身转化为一个hypervisor(虚拟机监视器)。KVM允许Lin......
  • 在Linux中,有哪些系统管理和配置工具?
    在Linux系统中,有众多的系统管理和配置工具,这些工具涵盖了从基本的系统配置、网络管理、用户和权限管理、服务管理、系统监控、备份与恢复等诸多方面。以下列举了一些关键类别及其代表性工具:1.系统配置与初始化工具sysctl:用于动态调整内核参数的工具。/etc/sysctl.conf:配置内......
  • 在Linux中,什么是文件系统?常用文件系统有哪些?
    在Linux中,文件系统是一种用于控制数据在存储设备上如何存储和检索的方法。它组织和管理磁盘上的文件和目录,并定义了文件的存储结构。文件系统负责跟踪文件的位置、大小、权限、创建和修改时间等信息。Linux支持多种文件系统类型,每种类型都有其独特的特性和用途。1.文件系统的作......
  • 在Linux中, 用户和组的概念是什么?作用分别是什么?
    在Linux系统中,用户和组是管理文件权限和系统访问控制的基本单位。它们是多用户操作系统中实现资源共享和安全隔离的关键概念。1.用户(User)概念:用户是Linux系统中的一个账户,代表一个操作者或一个服务进程。每个用户都有一个唯一的用户名和身份标识(UID)。作用:身份认证:用户......
  • 在Linux中, 什么是命令行界面(CLI)和图形用户界面(GUI)?
    在Linux系统中,命令行界面(CLI)和图形用户界面(GUI)是用户与操作系统交互的两种主要方式。它们各自有不同的特点和适用场景。1.命令行界面(CLI)命令行界面,也称为命令行或终端,是一个基于文本的界面,用户通过键入命令来与系统交互。CLI的特点包括:简洁高效:CLI提供了一种快速执行任务的方......
  • Kali Linux 与 Debian 的区别
    KaliLinux面向专业的渗透测试和安全审计。因此,KaliLinux已经进行了如下的多处核心的修改:1.单用户,设计成root权限登录:由于安全审计的本质,KaliLinux被设计成使用单用户,root权限“方案。2.默认禁用网络服务:KaliLinux包含了默认禁用网络服务的sysvinithooks。它......
  • kali linux 解决无线驱动程序问题
    TroubleshootingwirelessdriverissuesinLinuxcanbeafrustratingexperienceifyoudon’tknowwhattolookfor。Thisarticleismeanttobeusedasageneralguidelinetobetterhelpyoufindtheinformationyouneedtosolveyourwirelessissues。C......
  • Day 06 Linux的进程管理
    相关定义程序二进制文件,静态/usr/sbin/httpd,/usr/sbin/sshd,程序占用磁盘空间程序的两种状态:running和dead进程是程序运行的过程,动态,有生命周期的,可以产生和消亡的(进程是已启动的可执行程序的运行实例,实例即运行可执行程序),进程占用CPU和内存mem。父进程程序运行时产......
  • C++提高学习笔记
    C++提高学习笔记面向对象设计的基本概念面向对象的分析(OOA):解析出需求,需要做什么面向对象的设计(OOD):需要设计哪些类,类中有哪些数据成员,哪些成员函数,类与类之间的关系面向对象的变成(OOP):将需求与设计转换为代码UML语言:同一建模语言类与类之间的关系......
  • C++ 条件与 If 语句:掌握逻辑判断与流程控制精髓
    C++条件和If语句您已经知道C++支持数学中的常见逻辑条件:小于:a<b小于或等于:a<=b大于:a>b大于或等于:a>=b等于:a==b不等于:a!=b您可以使用这些条件来针对不同的决定执行不同的操作。C++具有以下条件语句:使用if来指定一个代码块,如果指定的条件为true,则......