当前位置: 首页 > news >正文

C++对象模型和this指针

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

基本概念:

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

每个空对象都会有一个独一无二的内存地址,所以,空对象占用内存空间的大小为1

代码实现:

#include <iostream>
using namespace std;//成员变量和成员函数 分开存储
class Person
{int m_A;//非静态成员变量,属于类的对象上static int m_B;//静态成员变量,不属于类对象上void func()//非静态成员函数,不属于类对象上{;}static void func2()//静态成员函数,不属于类对象上{;}
};
int Person::m_B = 0;
void test01()
{Person p;//空对象 占用内存空间为 : 1     //C++ 编译器会给每个空对象也分配一个字节的空间, 是为了区别空对象占内存的位置cout << "size of p = " << sizeof(p) << endl;
}
void test02()
{Person p;cout << "size of p = " << sizeof(p) << endl;
}
int main()
{test01();test02();system("pause");return 0;
}

this 指针概念:

我们知道在C++中成员变量和成员函数是分开存储的
每一个非静态成员函数只会诞生一份函数实例,也就是说每个同类型的对象会共用一块代码


C++通过提供特殊的对象指针,this指针,this指针指向被调用的成员函数所属的对象

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

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

代码:

#include <iostream>
using namespace std;
class Person
{
public:Person(int age){//this指针指向 被调用的成员函数 所属的对象this->age = age;}Person& PersonAddAge(Person &p){this->age += p.age;//this指向p2的指针,而*this指向的就是p2这个对象本体return *this;}int age;};
//1.解决名称冲突
void test01()
{Person p1(18);cout << "p1的年龄为:" << p1.age << endl;
} 
//2.返回对象本身用*this
void test02()
{Person p1(10);Person p2(10);p2.PersonAddAge(p1);cout << "p2的年龄:" << p2.age << endl;//链式编程思想 p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);cout << "p2的年龄:" << p2.age << endl;
}int main()
{test01();test02();system("pause");return 0;
}

空指针访问成员函数:

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

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

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//空指针调用成员函数class Person
{
public:void showClassName(){cout << "this is Person class " << endl;}void showPersonAge(){//报错的原因是因为传入的指针为NULLif (this == NULL){return;}cout << "age =" <<this->m_Age << endl;}int m_Age;
};
void test01()
{Person* p = NULL;p->showClassName();p->showPersonAge();}int main()
{test01();system("pause");return 0;
}

const修饰成员函数:

常函数:
●成员函数后加const后我们称为这个函数为常函数
●常函数内不可以修改成员属性
●成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
●声明对象前加const称该对象为常对象
●常对象只能调用常函数

代码:

#include <iostream>
using namespace std;//常函数
class Person
{
public://this指针的本质 是指针常量  指针的指向是不可以修改的//const Person * const this//在成员函数后面加上const,修饰的是this的指向,让指针指向的值也不可以修改void showPerson() const {this->m_B = 100;//this = NULL;//this指针是不可以修改指针的指向的}void func(){}int m_A;mutable int m_B;//特殊变量,即使在常函数中,也可以修改这个值,加上关键字mutable,这个const的指向可以修改};void test01()
{Person p;p.showPerson();
}
//常对象void test02()
{const Person p;//在对象前加const,变为常对象//p.m_A = 100;//修改不了p.m_B = 100;//m_B是特殊值,在常对象下也可以修改//常对象只能调用常函数!!!//p.func();//无法调用,因为这个函数不是常函数//常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性
}
int main()
{test01();test02();system("pause");return 0;
}

http://www.lryc.cn/news/10209.html

相关文章:

  • kubernetes教程 --Pod调度
  • 功率放大器科普知识(晶体管功率放大器的注意事项)
  • CentOS 7转化系统为阿里龙蜥Anolis OS 7
  • 【快速复习】一文看懂 Mysql 核心存储 隔离级别 锁 MVCC 机制
  • 面试题----集合
  • XSS注入基础入门篇
  • 刷题 - 数据结构(二)链表
  • 用于隔离PWM的光耦合器选择和使用
  • 面试完阿里,字节,腾讯的测试岗,复盘以及面试总结
  • 分享一个外贸客户案例
  • 【Kubernetes】第二篇 - 购买阿里云 ECS 实例
  • 数影周报:据传国内45亿条快递数据泄露,聆心智能完成Pre-A轮融资
  • Leetcode力扣秋招刷题路-0073
  • 遥感数字图像处理
  • 深度学习常用的python函数(一)
  • 2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(一)
  • PPS文件如何转换成PPT?附两种方法
  • ParallelsDesktop安装【亲测可行】
  • 在 Python 中只接受数字作为用户输入
  • 【集合】JAVA基础篇(二)
  • 机房意外掉电导致Elasticsearch的部分index无数据的修复过程
  • Spring入门案例三:注解进行引用类型的自动装配
  • kubernet + kubevirt + ceph 汇总文档
  • 软件测试项目实战(附全套实战项目教程+视频+源码)
  • Python seek()和tell()函数详解
  • 数据库系统:1. 绪论
  • Android App开发基础
  • 力扣-分数排名
  • 图文详解Ansible中的变量及加密
  • silicon labs平台通过串口升级固件方案