首页 > 编程语言 >详解类与对象——c++对象模型和this指针

详解类与对象——c++对象模型和this指针

时间:2025-01-23 12:29:39浏览次数:3  
标签:const 函数 对象 成员 c++ Person 详解 指针

在这里插入图片描述

(^ _ ^)

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

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

class Person {

public:

    Person() {

        mA = 0;

    }

    //非静态成员变量占对象空间

    int mA;

    //静态成员变量不占对象空间

    static int mB;

    //函数也不占对象空间,所有函数共享一个函数实例

    void func() {

        cout << "mA:" << this->mA << endl;

    }

    //静态成员函数也不占对象空间

    static void sfunc() {

    }

};

  

int main() {

  

    cout << sizeof(Person) << endl;

  

    system("pause");

  

    return 0;

}

只有非静态成员变量占对象空间
补充:
空对象占用的内存空间是:1;
原因:区分空对象占用内存的位置,每个空对象也都有一个独一无二的地址

二.this指针的概念

我们知道在C++中成员变量和成员函数是分开存储的

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
c++通过提供特殊的对象指针,this指针,解决区分哪个对象调用自己的问题。
this指针指向被调用的成员函数所属的对象

1.特点:

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

2.用途:

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

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

class Person

{

public:

  

    Person(int age)

    {

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

        this->age = age;

    }

  

    Person& PersonAddPerson(Person p)

    {

        this->age += p.age;

        //返回对象本身

        return *this;

    }

  

    int age;

};

  

void test01()

{

    Person p1(10);

    cout << "p1.age = " << p1.age << endl;

  

    Person p2(10);

    p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);

    cout << "p2.age = " << p2.age << endl;

}

  

int main() {

  

    test01();

  

    system("pause");

  

    return 0;

}

输出结果为:
p1=10;
p2=40;
(或者将成员变量命名为m_age也可以达到和this指针一样的目的)

三. 空指针访问成员函数

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

如果用到this指针,需要加以判断保证代码的健壮性(
if( this ==NULL)
{
return ;
}

//空指针访问成员函数

class Person {

public:

  

    void ShowClassName() {

        cout << "我是Person类!" << endl;

    }

  

    void ShowPerson() {

        if (this == NULL) {

            return;

        }

        cout << m_Age << endl;

    }

  

public:

    int m_Age;

};

  

void test01()

{

    Person * p = NULL;

    p->ShowClassName(); //空指针,可以调用成员函数

    p->ShowPerson();  //但是如果成员函数中用到了this指针,就不可以了

}

  

int main() {

  

    test01();

  

    system("pause");

  

    return 0;

}

四.const修饰成员函数

常函数:

  • 成员函数后加const后我们称为这个函数为常函数

  • 常函数内不可以修改成员属性

  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:

  • 声明对象前加const称该对象为常对象

  • 常对象只能调用常函数

class Person {

public:

    Person() {

        m_A = 0;

        m_B = 0;

    }

  

    //this指针的本质是一个指针常量,指针的指向不可修改

    //如果想让指针指向的值也不可以修改,需要声明常函数

    void ShowPerson() const {

        //const Type* const pointer;

        //this = NULL; //this指针不能修改指针的指向 

        //this->mA = 100; //但是this指针指向的对象的数据是可以修改的

  

        //const修饰成员函数,表示指针指向的内存空间的数据不能修改,除了mutable修饰的变量

        this->m_B = 100;

    }

  

    void MyFunc() const {

        //mA = 10000;

    }

  

public:

    int m_A;

    mutable int m_B; //可修改 可变的

};

  
  

//const修饰对象  常对象

void test01() {

  

    const Person person; //常量对象  

    cout << person.m_A << endl;

    //person.mA = 100; //常对象不能修改成员变量的值,但是可以访问

    person.m_B = 100; //但是常对象可以修改mutable修饰成员变量

  

    //常对象访问成员函数

    person.MyFunc(); //常对象不能调用const的函数

  

}

  

int main() {

  

    test01();

  

    system("pause");

  

    return 0;

}

标签:const,函数,对象,成员,c++,Person,详解,指针
From: https://blog.csdn.net/tanactor/article/details/145227516

相关文章

  • c++ 智能指针
    1. unique_ptr:这种智能指针是用于独占一份内存资源,一个资源也就只允许被一个unique_ptr占用。离开作用域后自动删除,无需显式调用delete。并且不能复制,只能转移。原理实现:template<typenameT>classunique_ptr{private:T*ptr;public:explicitunique_ptr(T*p......
  • Rust代码中有一个Vec集合对象,此集合中存放了一些结构体实例,这个Vec集合对象的生命周期
    eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee当你需要长生命周期的Vec并想在多个地方引用它内部的结构体实例时,有几种方法可以实现这种设计。以下是不同场景的解决方案:方法1:使用索引引用Vec元素如果Vec本身的生命周期长,而你只是需要访问其元素,可以通过索引......
  • GESP2024年6月认证C++六级( 第三部分编程题(1)计算得分)
    参考程序:#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[30];strings;intdp[N];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) { cin>>a[i]; } intm; cin>>m; cin>>s; for(inti=1;i<=......
  • 最新毕设-Django-新能源汽车推荐系统-30063(免费领项目)可做计算机毕业设计JAVA、PHP、
    摘要本论文主要论述了如何基于Django框架开发一个新能源汽车推荐系统,本系统将严格按照软件开发流程进行各个阶段的工作,爬取懂车帝的汽车信息,面向对象编程思想进行项目开发。在引言中,作者将论述新能源汽车推荐系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,......
  • JavaScript系列(40)--虚拟DOM实现详解
    JavaScript虚拟DOM实现详解......
  • JavaScript系列(39)-- Web Workers技术详解
    JavaScriptWebWorkers技术详解......
  • 一文详解Filter类源码和应用
    背景    在日常开发中,经常会有需要统一对请求做一些处理,常见的比如记录日志、权限安全控制、响应处理等。此时,ServletApi中的Filter类,就可以很方便的实现上述效果。  Filter类是一个接口,属于JavaServletAPI的一部分,主要用于在Servlet处理请求之前或之后执......
  • 咱们继续学Java——高级篇 第二百二十八篇:之Java 2D图形编程之通过系统剪贴板传递Java
    咱们继续学Java——高级篇第二百二十八篇:之Java2D图形编程之通过系统剪贴板传递Java对象在Java学习的征程中,我们不断探索知识的边界,每一次对新功能的深入学习都是成长的宝贵机会。我写这篇博客的目的,就是希望与大家一同学习Java2D图形编程中如何通过系统剪贴板传递Java......
  • 对象池框架 commons pool2 原理与实践
    当资源对象的创建/销毁比较耗时的场景下,可以通过"池化"技术,达到资源的复用,以此来减少系统的开销、增大系统吞吐量,比如数据库连接池、线程池、Redis连接池等都是使用的该方式。ApacheCommonsPool提供了通用对象池的实现,用于管理和复用对象,以提高系统的性能和资源利用率。1......
  • Spring 依赖注入详解:创建 Bean 和注入依赖是一回事吗?
    1.什么是依赖注入(DependencyInjection,DI)?依赖注入是SpringIoC(控制反转)容器的核心功能。它的目标是将对象的依赖(如其他对象或配置)从对象本身中剥离,由容器负责注入这些依赖。关键概念:依赖:一个对象需要的其他对象或资源。例如,UserController需要UserService。注入:Sprin......