C++对象模型和this指针

devtools/2024/9/25 8:30:46/

一.C++对象模型

--->成员变量和成员函数时分开储存的(在C++中,类内的成员变量和成员函数分开储存,

只有非静态成员变量才属于类的对象上

--->空对象:

#include <iostream>
using namespace std;
class Person
{};
void test01()
{Person p;cout << sizeof(p) << endl;//1
}
int main()
{test01();return 0;
}

#include <iostream>
using namespace std;
class Person
{
public:int m_A;//非静态成员变量,属于类的对象上static int m_B;//静态成员变量,不属于类的对象上void func() {};//非静态成员函数,不属于类的对象上
};
int Person::m_B = 0;//(类内声明,类外初始化)
void test01()
{Person p;cout << sizeof(p) << endl;//4
}
int main()
{test01();return 0;
}

用sizeof()计算类所占的空间时,只计算属于类的对象上的!!!!!!!!!!!!!!!!

!!!!!!!只有非静态成员变量属于类的对象上!!!!!!!

二.this指针

--->指向被调用的成员函数所属的对象

//用this指针解决名称冲突
#include <iostream>
using namespace std;
class Person
{
public:Person(int age)//有参构造函数{this->age = age;//this指针指向的是被调用的成员函数所属的对象,谁调用了这个有参构造,this指针就指向谁}int age;//成员变量与形参撞名
};
void test01()
{Person p(18);cout << "p的年龄为:" << p.age << endl;
}
int main()
{test01();return 0;
}
//返回对象本身用*this
#include <iostream>
using namespace std;
class Person
{
public:Person(int age){this->age = age;}Person& PersonAddAge(Person& p){this->age += p.age;return *this;//返回本身才能实现叠加操作(链式编程思想)}int age;
};
void test01()
{Person p1(10);Person p2(20);p2.PersonAddAge(p1);cout << p2.age << endl;//30
}
int main()
{test01();return 0;
}

--->链式编程思想:

必须要指针的指针才能对p2进行修改,否则return的只是p2的副本

三.空指针访问成员函数

(C++空指针可以调用成员函数,但要注意有没有用到this指针)

//空指针访问成员函数
#include <iostream>
using namespace std;
class Person
{
public:void showPerson(){cout << "This is Person class" << endl;}void showPersonAge(){cout << "age=" << m_Age << endl;//等价于this->m_Age}int m_Age;//非静态成员变量,属于类的对象上,编译器不知道年龄属于哪个对象
};
void test01()
{Person* p=NULL;p->showPerson();//正常运行p->showPersonAge();//报错(原因:传入指针为空)
}
int main()
{test01();return 0;
}

--->改进:(若为空指针,直接返回,不进行访问)


http://www.ppmy.cn/devtools/21973.html

相关文章

Oracle 中的函数

01-存储函数 1-1 什么是存储函数 存储函数 自定义函数(我们自己写的函数) 存储函数 为了给我们一个结果的 可以通过 select 函数名 直接使用 !!! 存储函数必须有返回值 1-2 存储函数的特点 存储函数必须有返回值 select 函数名 1-3 语法 CREATE [ OR REPLACE ] FUN…

【ARM Cache 系列文章 11 -- ARM Cache 组织形式详细介绍】

请阅读【ARM Cache 系列文章专栏导读】 文章目录 ARM Cache组织形式直接映射(Direct Mapped)直接映射示例直接映射原理Cache颠簸(cache thrashing)原因ARM Cache组织形式 在ARM体系结构中,缓存(Cache)是一种关键的硬件机制,用于减少处理器访问内存所需的时间。缓存可以…

采用php vue2 开发的一套医院安全(不良)事件管理系统源码(可自动生成鱼骨图)

采用php vue2 开发的一套医院安全&#xff08;不良&#xff09;事件管理系统源码&#xff08;可自动生成鱼骨图&#xff09; 医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;以事件…

GO语言核心30讲 基础知识

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 1. 两种声明变量方式的差异&#xff1a; 短变量声明 name : "abc" 只能在函数体内部使用。 var name "abc" 这方式才可以用在所有地方。 2. 类型推断有什么好处&#xff1f; 代码重构时更方…

Java23种设计模式-创建型模式之建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;也被称为生成器模式&#xff0c;是一种创建型设计模式&#xff0c;主要用于解决复杂对象的构建问题。建造者模式的主要特点是&#xff1a; 1.分离构建与表示&#xff1a;将一个复杂对象的构建与它的表示分离&…

Java基础知识总结(77)

* 2、JMM模型 JMM&#xff08;Java Memory Model&#xff09;&#xff1a;Java 内存模型&#xff0c;是 Java 虚拟机规范中所定义的一种内存模型&#xff0c;Java 内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别。也就是说&#xff0c;JMM 是 JVM 中定义的一种并…

AI视频下载:零基础2小时学会开发 Chrome扩展程序

无论您是有抱负的Web开发人员、AI爱好者还是生产力黑客&#xff0c;本课程都提供了宝贵的见解和实践经验&#xff0c;帮助您利用AI和Chrome扩展的力量来简化Web自动化&#xff0c;改善各个行业和领域的用户体验&#xff0c;解锁AI驱动生产力的潜力&#xff01; 此课程面向以下…

wpf 按钮禁用样式

在WPF中&#xff0c;要为按钮创建一个禁用样式&#xff0c;需要在资源字典中定义一个Style&#xff0c;该样式将应用于Button控件的IsEnabled属性为False时的状态。 以下是一个简单的例子&#xff1a; <Style TargetType"Button" x:Key"NormalButtonStyle&…