c++对象模型和this指针

文章介绍了C++中类的成员变量和成员函数的存储方式,强调了this指针的作用以及空指针的处理,同时提到了常函数和常对象的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

虽然类里的成员被封装在一起,但是他们并不是存储在一起,成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。静态成员变量,静态成员函数,非静态成员函数都不在类的对象上。

 c++编译器为了区分每个空对象占内存的位置,会给每个空对象也分配一个字节的空间 
    空对象占用内存空间 
    每个空对象也应该有独一无二的内存地址 

#include<iostream>
#include<string>
using namespace std;
class person
{
	public:
	int m_b; //非静态成员变量,属于类的对象上 
	static int m_a; //静态成员变量,不属于类对象上
	void func()//非静态成员函数 ,不属于类对象上 
	{
		
	 } 
	 static void func2()//静态成员函数,不属于类对象上 
	 {
	 } 
};
int person :: m_a = 10;//静态成员变量,类内声明类外初始化 

void test01()
{
	person p;
	person p2; 
	//c++编译器为了区分每个空对象占内存的位置,会给每个空对象也分配一个字节的空间 
	//空对象占用内存空间 
	//每个空对象也应该有独一无二的内存地址 
	cout << "sizeof p = " << sizeof(p) << endl;
}
int main()
{
	test01(); 
	//test02();
 } 

2.this指针概念

c++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是多个同类型的对象会共用一块代码。那么问题是,这一块代码是如何区分哪个对象调用的自己呢?

c++提供了this指针来解决这个问题。this指针指向被调用的成员函数所属的对象。

#include<iostream>
#include<string>
using namespace std;
//1.解决形参和成员变量名称冲突
//2.返回对象本身用*this 
class person
{
	public:
		person(int age)
		{
			this->age = age;//this指针指向被调用的成员函数所属的对象 
		}
		person& personaddage(person &p)//返回本体用引用的方式返回 
		{//如果返回值是person(值)则会一直创建新的对象返回。 
			this->age += p.age ;
			return *this;//返回对象本体 
		}
		int age;
};
void test02()
{
	person p1(10);
	person p2(10);
	//链式编程思想 
	p2.personaddage(p1).personaddage(p1).personaddage(p1);
	cout <<"p2的年龄为" << p2.age << endl; 
 } 

int main()
{
	
	 test02(); 
 } 

3.空指针访问成员函数

c++中空指针也是可以调用函数的,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码的健壮性。

#include<iostream>
#include<string>
using namespace std;
//空指针调用成员函数 
class person{
	public:
		void showclassname()
		{
			cout <<" this is person class" << endl;
		}
		void showpersonage()
		{
			
		    if(this == null)
			{
				return ;
			 } 
			 //报错原因是因为传入的指针是为null,没有创建实体 
			cout <<"age: " << this->m_age << endl; 
		}
	int m_age; 
}; 
void test01()
{
	person *p = NULL;
	p->showclassname();
	p->showpersonage();
}
int main()
{
	test01();
	return 0;
}

4.const修饰成员函数

常函数:

    成员函数后加const

    void showperson() const

         常函数内不可以修改成员属性

         成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:

       声明对象前加const 

       常对象只能调用常函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值