C++核心编程之---类和对象---C++对象模型和this指针

news2024/9/27 12:09:04

目录

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

二、this指针

三、空指针访问成员函数

四、const修饰成员函数

常函数:

常对象:


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

在C++中,类内的成员变量和成员分开存储

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

示例:

#include<iostream>

#include<string>

using namespace std;

// 成员变量 与 成员函数 是分开存储的

class student {



};

class person {

    int a; // 非静态的成员变量  属于类的对象上



    static int b; // 静态的成员变量  不属于类的对象上



    void func() {} // 非静态成员函数  不属于类的对象上



    static void func2() {} // 静态成员函数  不属于类的对象上

};



// 初始化

int person::b = 0;



void test01()

{

    student s;



    // c++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置

    // 每个空对象也有独一无二的内存地址

    // 空对象的字节空间是 1

    cout << "studednt 类的对象占多少字节空间 " << sizeof(s) << endl;

}

void test02()

{

    person p1;

    // 不是空的就按照里面的数据类型分配空间

    cout << "p1 类的对象占多少字节空间 " << sizeof(p1) << endl;

}

int main()

{

    test01();

    test02();

    return 0;

}

运行结果:

 

二、this指针

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

那么问题来了:这一块代码是如何区分哪个对象在调用呢?

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

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

 this指针是隐含每一个非静态成员函数内的一种指针

 this指针不需要定义,直接调用即可

this指针的用途:

1. 当形参和成员变量同名时,可以用this指针来区分

2. 在类的非静态成员函数中返回对象本身,可以使用 return *this

示例:

#include<iostream>

#include<string>

using namespace std;



// 2. 返回对象本身时用return *this

class person {

public:

    person(int age)

    {

        // 1. 解决名称冲突

        this->age = age;

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

    }

    void person_add_age(person& p)

    {

        this->age += p.age;

    }



    person& person_add_Age(person& p)

    {

        this->age += p.age;

        // this 指向p4的指针,而*this指向的就是p4这个对象本体

        return *this;

    }



    // 以值的形式返回

    person person_Add_Age(person& p)

    {

        this->age += p.age;

        // this 指向p4的指针,而*this指向的就是p4这个对象本体

        return *this;

    }

    int age;

};



// 1. 解决名称冲突



void test01()

{

    person p1(18);



    cout << "p1的年龄 " << p1.age << endl;

}

void test02()

{

    person p2(10);

    person p3(10);

    p3.person_add_age(p2);

    cout << "p2的年龄 " << p2.age << endl;

    cout << "p3的年龄 " << p3.age << endl;





    person p4(10);

    // 函数的返回值还是p4本身可以继续调用函数

    p4.person_add_Age(p2).person_add_Age(p2);// 链式编程思想

    cout << "p4的年龄 " << p4.age << endl;



    person p5(20);

    p5.person_Add_Age(p5).person_Add_Age(p5);

    cout << "p5的年龄 " << p5.age << endl;

}

int main()

{

    test01();

    test02();

    return 0;

}

运行结果:

 

三、空指针访问成员函数

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

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

示例:

#include<iostream>

#include<string>

using namespace std;

 

// 空指针调用成员函数

class person{

public:

    void show_class_name()

    {

        cout<<"这是person的一个类"<<endl;

    }

    void show_person_age()

    {

        if(this==NULL)

        return ;  // 如果this为NULL直接return掉

        cout<<"age是"<<this->age<<endl;

        // 报错的原因是传入的指针为空指针(NULL)

    }

 

    int age;

};

void test01()

{

    person *p = NULL;

    p->show_class_name();

    p->show_person_age();

    // 空指针可以调用成员函数

}

int main()

{

    test01();

    return 0;

}

运行结果:

报错提示:

 

四、const修饰成员函数

  1. 常函数:

    1.  成员函数 后加 const 后我们称这个函数为常函数
    2.  常函数内不可以修改成员属性
    3.  成员声明时加关键字 mutable 后,在常函数中依然可以修改
  2. 常对象:

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

示例:

#include<iostream>

#include<string>

using namespace std;



// 常函数

class person {

public:



    // this指针的本质是  指针常量  指针的指向是不可以修改的

    // this在这里的意思是 Person * const this;  (指针的指向不可以改)

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

    void show_person() const  // (再加一个const那么this指针的指向和值都不可以改变)

    //  相当于常函数

    {

        this->b = 100;

    }



    void func()

    {



    }



    int a;

    // +mutable  后可以修改值

    mutable int b; // 特殊变量 即使在常函数中,也可以修改这个值

};





void test01()

{

    person p;

    p.show_person();

}

// 常对象

void test02()

{

    const person p1; // 在对象前 + const 变为常对象

    p1.b = 100; // b是特殊值,在常对象下也可以修改



    // 常对象只能调用常函数

    p1.show_person();

    // 常对象不能调用普通成员函数

    // p1.func();

    // 因为普通成员函数可以修改属性

}

int main()

{

    test01();

    test02();

    return 0;

}

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1151452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机基础知识42

标签的分类和嵌套 1. 单标签&#xff1a; img br hr # <img /> 2. 双标签&#xff1a; a h p div # <a></a> 3. 按照标签属性分类&#xff1a; 块儿标签&#xff1a; 自己独自占一行 # h1-h6 p div 行内(内联)…

2023高德地图poi资源下载

全国8千万地图poi地图数据&#xff1a;含名称、地址、电话、省份、城市、区县、经纬度、电话等信息

笔记47:FCN网络的Pytorch实现

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\1.语义分割任务\Pytorch中FCN的实现 a a a

数据结构——线性表②(链表)

《数据结构——线性表①&#xff08;顺序表&#xff09;》一文中已经讲了线性表顺序存储–顺序表相关内容&#xff0c; 这篇文章一起来学习 线性表的链式存储–链表↓↓↓↓↓ 一、链表的定义 线性表的链式存储称为链表&#xff0c;那什么是链式存储呢 其实理解起来就和火车差…

Jetpack:023-Jetpack中的事件二

文章目录 1. 知识回顾2. 使用方法2.1 单击事件2.2 双击事件2.3 长按事件2.4 滑动事件 3. 示例代码4. 内容总结 我们在上一章回中介绍了 Jetpack中事件相关的内容&#xff0c;本章回中继续介绍这方面的内容。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff01;…

【Java数据结构重点知识】第一节:认识数据结构与算法、集合框架

一&#xff1a;数据结构与算法 1.数据结构 数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合 2.算法 算法就是定义良好的计算过程。他取一个或一组的值为输入&#xff0c;并产生一个或一组作为输出。简单来说就是一系列的…

Linux】centos安装配置及远程连接工具的使用

【Linux】centos安装配置及远程连接工具的使用 1.使用vmware创建虚拟机&#xff0c;因为过程比较简单就没有截图了&#xff0c;根据下面步骤来就行。2.网络配置3.MobaXterm连接CentOS1.new session2.点击ssh&#xff0c;输入虚拟机的IP地址即可 4.进行阿里云换源1.进入2.下载wg…

AMD:抢占AI芯片宝座

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;AMD受益于AI芯片的出口限制&#xff0c;使其能够获得更多的中国市场份额&#xff0c;并增强其在AI芯片市场的地位。 &#xff08;2&#xff09;AMD的处理器&#xff0c;特别是E…

ctfshow-web入门命令执行29-36

29 源代码给了禁用flag 使用tac、nl ?cecho nl f*; ?cecho tac f*; 30 多禁用了system和php 和上题区别不大&#xff0c;使用上一题命令就能解 ?cecho nl f*; ?cecho tac f*; 31 禁用了空格使用%09代替 ?cecho%09tac%09f*; 32 禁用了echo 使用php伪协议 ?cinclud…

从零开始学习搭建量化平台笔记

从零开始学习搭建量化平台笔记 本笔记由纯新手小白开发学习记录&#xff0c;欢迎大佬请教指点留言&#xff0c;有空的话还可以认识一下&#xff0c;来上海请您喝咖啡~~ 2023/10/30&#xff1a;上份工作辞职并休息了几个月后&#xff0c;打算开始找个关于量化投资相关的工作。面…

云原生之使用Docker部署slash书签共享平台

云原生之使用Docker部署slash书签共享平台 一、slash介绍1.1 slash简介1.2 slash特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载slash镜像五、部署slash书签共享平台5…

2模块和包的一些总结:导入库和模块

感觉这块好零散呀&#xff0c;应该怎么去写呢&#xff1f;截图吧 1、导入多个模块的方法 #导入多个包有几种办法 # 1.用点号 # 2.用逗号import p1.Tool import p1.sub_p.sub_xxxprint(p1.Tool.num) print(p1.sub_p.sub_xxx.num)import p1.Tool,p1.sub_p.sub_xxx print(p1.Tool…

基于纵横交叉算法的无人机航迹规划-附代码

基于纵横交叉算法的无人机航迹规划 文章目录 基于纵横交叉算法的无人机航迹规划1.纵横交叉搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用纵横交叉算法来优化无人机航迹规划。 …

【2023.10.30练习】C语言-循环右移字符

计算机能力挑战初赛2020.19题 题目描述&#xff1a; 现要对一个由字符a-z和A-Z组成的字符串进行解密&#xff0c;已知加密规则是&#xff1a; 字符串中所有字符分别在大写或小写的字母表中被循环左移5位(fGh-->aBc)&#xff0c; 输入&#xff1a;一个加密过的字符串&#…

【MySQL索引与优化篇】数据库优化及性能分析工具使用

数据库优化及性能分析工具使用 文章目录 数据库优化及性能分析工具使用1. 数据库服务器优化的步骤2. 查询系统性能参数3. 定位执行满的SQL&#xff1a;慢查询日志4. 查看SQL执行成本&#xff1a;show profile5. 分析查询工具&#xff1a;explain5.1 id5.2 type 6. explain进一步…

【AI视野·今日Sound 声学论文速览 第三十一期】Mon, 23 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 23 Oct 2023 Totally 9 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Two-Stage Triplet Loss Training with Curriculum Augmentation for Audio-Visual Retrieval Authors Donghuo Zeng, Kazushi Ikeda跨模态…

dp三步问题

三步问题 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:int waysToStep(int n) {vector<int> dp(n1,1);if(n1) return 1;dp[1]1;dp[2]2;for(int i3; i<n1; i){dp[i] ((dp[i-1]dp[i-2])%1000000007dp[i-3])%100…

类变量/方法、main语法、代码块

一.类变量和方法 思维导图概览&#xff1a; 1.1类变量&#xff08;静态变量&#xff09; 1.什么叫做类变量/方法&#xff1f; ——给类中的成员属性或成员方法加上static关键字进行修饰&#xff0c;类变量/方法也叫做静态变量/方法&#xff0c;静态变量/方法被类的自身所有对…

C/C++ 飞翔的小鸟

载入问题&#xff1a; 解决之后效果&#xff1a; 放在main函数里面进行封装&#xff1a; 效果展示: 实现下坠 放进while&#xff08;1&#xff09;里面不断进入循环&#xff0c;每次进入循环&#xff0c;鸟的y坐标值就会发生变化&#xff0c;以此实现下下坠效果 效果展示&#…

取消Excel打开密码的两种方法

Excel设置了打开密码&#xff0c;想要取消打开密码是由两种方法的&#xff0c;今天分享这两种方法给大家。 想要取消密码是需要直到正确密码的&#xff0c;因为只有打开文件才能进行取消密码的操作 方法一&#xff1a; 是大家常见的取消方法&#xff0c;打开excel文件之后&a…