C++ 类和对象(四)对象模型和this指针

C++ 类和对象(四)对象模型和this指针

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

C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上

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

虽然是空对象,也不能跟别人占用同样的位置

2. this指针概念

每个非静态成员函数只有一份函数实例, 即多个同类型的对象共用一块代码
这个代码是如何区分是哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
(即调用这个函数的对象)

  • this指针是隐含在每一个非静态成员函数内的一种指针
  • this指针不需要定义, 直接使用即可

this指针的用途:

• 当形参和成员变量同名时, 可以用this指针来区分
• 在类的非静态成员函数中返回对象本身,return *this

class Person {
public:
	Person(int age)
	{
		//形参和成员变量同名时候,可以用this 来区分
		//age = age;
		this->age = age;
	}
    //返回自身
	Person& personAddPerson(Person p)
	{
		this->age += p.age;
		return *this;
	}
	int age;
};

void func()
{
	Person p(10);
	cout << "age is : " << p.age << endl;
}

void func1()
{
	Person p(10);
	Person p1(10);
	//p.personAddPerson(p1);
	p.personAddPerson(p1).personAddPerson(p1).personAddPerson(p1);//链式编程思想

	cout << "result is :" << p.age << endl;

}

区分同名参数
在这里插入图片描述
返回对象本身
在这里插入图片描述

3. 空指针访问成员函数

C++中空指针也可以调用成员函数,但是也要注意有没有用到this指针
如果用到了this指针,就需要加以判断保证代码的健壮性

class Person {
public:
	void showAge()
	{
        //提高代码的健壮性
		if (this == NULL)
		{
			return;
		}
		cout << "age is : " << m_age << endl;//this->m_age
	}
	int m_age;
};

void func()
{
	Person *p = NULL;
	p->showAge();
}

在这里插入图片描述
this 是一个空指针,就是一个空的对象,怎么访问到对象的成员变量

4. const 修饰成员函数

常函数:

• 成员函数后面加 const 后我们称为该函数为常函数
• 常函数内不可以修改成员属性
• 成员属性声明时候加关键字mutable后,在常函数中依然可以修改

常对象:

• 声明对象前加const称该对象为常对象
• 常对象只能调用常函数

this指针的本质:指针常量
Person * const this :
指针是不可以修改的 [this 的本质] ---->>> 指针不能指向别的对象,也不能指向空指针
this指针本来是指针常量,一旦指向了某个对象,就不能再指向另外的对象

const Person * const this:
指针指向的值也不可以修改 —>>>> void showPerson() const

在成员函数后面加 const , 修饰的是this的指向, 让指针指向的值也不可以修改
指针的指向是不可修改的

class Person {
public:

	//Person * const this;
	void func0() const
	{
		//m_a = 100; //错误, 常函数内不能修改成员变量
		m_b = 100;
	}
	void func3()
	{
	}

	int m_a;
	mutable int m_b;//加 mutable 后 常函数可以修改
};

void func2()
{
	const Person p;
	//p.m_a = 100; //报错, 常对象不能修改成员变量
	p.m_b = 100;

	//p.func3(); //报错, 常对象不能调用普通函数, 常对象不能修改其中的变量
						//而普通函数可以修改变量
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C++模型来说明对象之间的“组合聚集”关系: ```c++ class Person { private: string name; int age; Address* address; public: Person(string name, int age, Address* address) { this->name = name; this->age = age; this->address = address; } void display() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; cout << "Address: " << address->getFullAddress() << endl; } }; class Address { private: string street; string city; string state; string country; public: Address(string street, string city, string state, string country) { this->street = street; this->city = city; this->state = state; this->country = country; } string getFullAddress() { return street + ", " + city + ", " + state + ", " + country; } }; ``` 这个模型中,Person与Address之间存在“组合聚集”关系。Person包含一个指向Address对象指针,Address对象则可以独立存在。 在这个模型中,Person代表一个人,包含姓名、年龄和地址等信息。而Address代表一个地址,包含街道、城市、州和国家等信息。由于一个人可以有一个地址,因此Person包含了一个指向Address对象指针。 实现这个模型的关键点在于理解“组合聚集”关系的含义,即一个对象(Person)包含另一个对象(Address),但是被包含的对象(Address)可以独立存在。在代码中,我们使用了指向Address对象指针来实现这种关系。需要注意的是,当Person对象被销毁时,它持有的Address对象也应该被销毁,因此需要在Person的析构函数中释放Address对象的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值