IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++对象模型和this指针 -> 正文阅读

[C++知识库]C++对象模型和this指针

C++对象模型和this指针

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

1
只有非静态成员变量才属于类的对象上
空对象占用字节为1

 class Person
{

};
void test01()
{
	Person p;
	cout << "size of = " << sizeof(p) << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

在这里插入图片描述
占用内存空间为 1 的原因是:如果有其他的空对象,各自分配一个内存空间可以让两者之间相互区别,而且 1 字节也很省内存。 所以每个空对象都会有一个自己的内存地址。

2

class Person
{
	int m_A;//改为有内容
};
void test02()
{
	Person p;
	cout << "size of = " << sizeof(p) << endl;

}
int main()
{
	test02();

	system("pause");
	return 0;
}

在这里插入图片描述
因为 int 类型 ,不把之前的空类型考虑进去。

将Person类改为

class Person
{
	int m_A;// 非静态成员变量 属于类的对象上
	static int m_B;// 添加 静态成员变量 不属于类的对象上
};
int Person::m_B = 0;

在这里插入图片描述

非静态成员变量 属于类的对象上
静态成员变量,不属于类对象上

所以不考虑在内

class Person
{
	int m_A;// 非静态成员变量 属于类的对象上
	static int m_B;// 添加 静态成员变量 不属于类的对象上
	void func()  //非静态成员函数
	{
	}
};
int Person::m_B = 0;

在这里插入图片描述
所以成员变量和成员函数是分开存储的,非静态成员函数不属于类对象上

static voidfunc()
{}
静态成员函数也不会增加 不属于类对象上


this指针

用于区分类中多个对象调用函数时,分别都是哪个函数在调用自己。

this 指针指向被调用成员函数所属的对象

特点:
1 this指针是隐含每一个非静态成员函数内的一种指针
2 this 指针不需要定义,直接使用即可。

用途:
1 当形参和成员变量同名时,可用this指针来区分
2 在类的非静态成员变量中返回对象本身,可使用return *this

  class Person
{
public:
	Person(int age)//变量
	{
		//this指针指向的是被调用成员函数的所属对象
		//即 p1, 所以可以解决和变量的名称冲突
		this->age = age;//前一个为成员变量,后一个age为形参
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年龄为: " << p1.age << endl;
}
main()
{
	test01();
	system("pause");
	return 0;
}

如果不加 this 都会默认为形参 age ,从而报错。
this 指向被调用的对象,此时为 p1。

2

class Person
{
public:
	Person(int age)
	{
		//this指针指向的是被调用成员函数的所属对象
		//即 p1, 所以可以解决和变量的名称冲突
		this->age = age;
	}
	void PersonAddAge(Person &p)
	{
		this->age += p.age;
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年龄为: " << p1.age << endl;
}
//返回对象本身用*this 
void test02()
{
	Person p1(10);
	Person p2(10);

	p2.PersonAddAge(p1);
	cout << "p2年龄:" << p2.age << endl;
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

此时p2为 20 ,若要多次相加需要改动为

class Person
{
public:
	Person(int age)
	{
		//this指针指向的是被调用成员函数的所属对象
		//即 p1, 所以可以解决和变量的名称冲突
		this->age = age;
	}
	Person& PersonAddAge(Person &p)//此处void 改为Peroson是因为返回值如果是p2的话,就可以将p2.PersonAddAge(p1) 看作p2,然后继续调用之后的PersonAddAge(p1)
	//此处的Person &p是以 引用的方式传入
	//此处的Person& 是以引用的方式返回
	{
		this->age += p.age;
		// this是指向p2的指针,而*this就是p2本体
		return* this;
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年龄为: " << p1.age << endl;
}
//返回对象本身用*this 
void test02()
{
	Person p1(10);
	Person p2(10);

	p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
	cout << "p2年龄:" << p2.age << endl;
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

在这里插入图片描述
链式编程思想:可以往后无限的追加。

但如果函数,不使用引用方法,返回的是一个值,就会创建新的对象

Person PersonAddAge(Person &p)//不使用引用方法
	{
		this->age += p.age;
		// this是指向p2的指针,而*this就是p2本体
		return* this;
	}
	int age;
};

在第一次调用Person PersonAddAge()后 ,p2加了10, 但在这之后返回的并不是本体了,而是根据本体创建的一个新的数据。Person 和 *this 是不一样的数据(见拷贝构造函数的调用时机-以值方式返回局部对象)。 所以每一次Person PersonAddAge()后,都是一个新的对象,所以最后输出结果p2 是不变的20。
疑问:至于为什么不是p2 为 10 。 以值方式返回局部对象会调用拷贝构造函数。对p2进行一次PersonAddAge操作后,将p2的结果拷贝为p2’ 。所以p2还是经过了一次加年龄的操作的 。对p2进行一次PersonAddAge操作后,将p2的结果拷贝为p2’

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 12:49:03  更:2021-10-29 12:49:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:23:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码