C++对象模型与this指针

这篇具有很好参考价值的文章主要介绍了C++对象模型与this指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 成员变量与成员函数分开存储

2 this指针

2.1 作用1

2.1.1示例

2.2 作用2

3 空指针访问成员函数

4 const修饰成员函数

4.1示例

4.2 常对象


1 成员变量与成员函数分开存储

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

首先,对于一个空对象,占用内存空间为1

 class person
 {
 ​
 };
 ​
 void test01()
 {
   person p;
   cout << sizeof(p) << endl;
 }

C++对象模型与this指针

因为C++编译器给每个空对象分配1个字节空间,防止不同空对象占用同一块内存空间,便于区分


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

在person类中加入一个非静态成员变量

 class person
 {
   int m_a; // 非静态成员变量,属于类的对象上
 };
 ​
 void test02()
 {
   person p;
   cout << sizeof(p) << endl;
 }

C++对象模型与this指针

再加上静态成员变量

C++对象模型与this指针

再加上非静态成员函数

C++对象模型与this指针

最后加上静态成员函数

C++对象模型与this指针

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

2 this指针

概念:上一节中我们知道成员变量与成员函数分开存储,每一个非静态成员函数只会产生一份函数实例,也就是多个同类型的对象共用一块代码,而如何区分究竟是哪个对象调用自己,用到this指针

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

性质:

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

  • this指针不需要定义,可以直接使用

2.1 作用1

当形参与成员变量同名时,可用this指针加以区分

2.1.1示例

我们先创建类person和测试函数test01,在类内创建属性m_age,函数person,形参age

 class person
 {
 public:
   person(int age)
   {
     m_age = age;
   }
   int m_age;
 };
 void test01()
 {
   person p(20);
   cout << p.m_age << endl;
 }

此时可正常输出

但是,如果我们将属性m_age改为age得到这个

 class person
 {
 public:
   person(int age)
   {
     age = age;
   }
   int age;
 };
 void test01()
 {
   person p(20);
   cout << p.age << endl;
 }

C++对象模型与this指针

同颜色的即为同一个age,无法正常输出

在此基础上,我们在函数内加上this指针

 class person
 {
 public:
   person(int age)
   {
     this->age = age; // 加上this->
   }
   int age;
 };

C++对象模型与this指针

可以发现3个age是同源的。此时,this就代表pthis->age == p.age;

C++对象模型与this指针


2.2 作用2

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

 class person
 {
 public:
   person(int age)
   {
     this->age = age;
   }
   void personAdd(person& p) // 函数本体age加上参数P的age
   {
     this->age += p.age;
   }
   int age;
 };
 void test02()
 {
   person p1(10);
   cout << p1.age << endl;
   person p2(10);
   cout << p2.age << endl;
 }

C++对象模型与this指针

而如果我们想要多次加和

 void test02()
 {
   p2.personAdd(p1);
   cout << p2.age << endl;
 ​
   p2.personAdd(p1).personAdd(p1).personAdd(p1); // 想要多次加和
   cout << p2.age << endl;
 }

C++对象模型与this指针

要先修改函数体返回值

 person& personAdd(person& p) // 而且要引用
   {
     this->age += p.age;
     return *this; // 返回对象本身
   }

C++对象模型与this指针

而如果函数体返回值不使用引用&,则无法修改值

C++对象模型与this指针

因为这样修改完第一次p2后,返回的是另一个变量,并且后面第2次开始修改的都是另一个变量,再另一个变量

3 空指针访问成员函数

C++中空指针也可以调用成员函数,不过要注意是否用到this指针

如果遇到this指针,加上判断,防止代码出错

 class person
 {
 public:
   void show_name()
   {
     cout << "Joyce" << endl;
   }
   void show_age()
   {
     cout << this->m_age << endl;
   }
 ​
   int m_age;
 ​
 };
 void test01()
 {
   person* p = NULL;
   p->show_age(); // 非法访问
   p->show_name();
 }

对于这段代码,指针p为NULL,调用show_name函数时可以正常输出,因为她只是简单的打印特定的内容,而调用show_age函数时将报错,因为函数内this->m_age;调用了this指针的m_age,而this指针为NULL,造成非法访问

因此,我们在函数内部加上判断

 void show_age()
   {
     if (this == NULL)
     {
       return;
     }
     cout << this->m_age << endl;
   }

以此便可以防止代码为NULL时出错

4 const修饰成员函数

常函数:

  • 成员函数后加const称该函数为成员函数

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

  • 成员属性声明时加关键字mutable,在常函数中仍然能修改

4.1示例

接下来创建person类与函数show_name;

 class person
 {
 public:
   void show_name()
   {
     this->m_a = 100; // 非 常对象,可修改
     this = NULL;// this指针的指向不可修改
   }
   int m_a;
 };

C++对象模型与this指针

因为this指针本质是一个指针常量,所以其指向(地址)不可修改,但其指向的值可以修改

本质person * const this;


不过,如果在函数加上const,则地址与值都不可修改

本质const person \*const this;

C++对象模型与this指针

不过,如果在常函数中的属性的声明前加上mutable,则可以修改

 class person
 {
 public:
   void show_name() const // 这里有const
   {
     this->m_a = 100; //可修改
   }
   mutable int m_a; // 加上const
 };

4.2 常对象

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

  • 常对象只能调用常函数

 class person
 {
 public:
   void show_name() const
   {
     this->m_a = 100; 
   }
   mutable int m_a;
   int m_b;
 };
 void test02()
 {
   person p;
   p.m_b = 20; 
 }

此时test02内可以修改m_b;接下来在p前加上const使其变成常对象

 void test02()
 {
   const person p;
   p.m_b = 20; // 不可修改
   p.m_a = 20; // 可修改
 }

m_b不可修改,而m_a由于前面加了mutable,可以修改

C++对象模型与this指针


同时,在person类中我们再创建一个普通函数func,尝试在test函数中调用刚才的常函数和普通函数

 class person
 {
 public:
   void show_name() const // 常函数
   {
     this->m_a = 100; 
   }
   void func() // 普通函数
   {
     ;
   }
   mutable int m_a;
   int m_b;
 };
 ​
 void test02()
 {
     const person p; // 创建常对象
   p.show_name(); // 常函数
   p.func(); // 普通函数
 }

C++对象模型与this指针

无法调用,因为常对象只能调用常函数(因为普通函数可以修改属性)文章来源地址https://www.toymoban.com/news/detail-406193.html

到了这里,关于C++对象模型与this指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++对象模型和this指针

    ---成员变量和成员函数时分开储存的(在C++中,类内的成员变量和成员函数分开储存, 只有非静态成员变量才属于类的对象上 ) ---空对象: 用sizeof()计算类所占的空间时,只计算属于类的对象上的!!!!!!!!!!!!!!!! !!!!!!!只有非静态成员变量

    2024年04月29日
    浏览(38)
  • 【C++深入浅出】类和对象上篇(类的基础、类的模型以及this指针)

    目录 一. 前言  二. 面向对象与面向过程         2.1 面向过程         2.2 面向对象 三. 类的基础知识 3.1 类的引入 3.2 类的定义 3.3 成员变量的命名规则 3.4 封装 3.5 类的访问限定符 3.6 类的作用域 3.7 类的实例化 四. 类的对象模型 4.1 类对象的大小 4.2 类对象的存储方式 4.3 空

    2024年02月10日
    浏览(56)
  • C++day3(类、this指针、类中的特殊成员函数)

    1.类的应用实例 2.定义一个矩形类(Rectangle),包含私有成员长(length)、宽(width),定义成员函数: 设置长度: void set_len(int l); 设置宽度: void set_wid(int w); 获取长度: int get_len(); 获取宽度: int get_wid(); 显示周长和面积: void show(); 3.必须使用this指针的场合 4.构造函数允许函数重载 5.构造

    2024年02月11日
    浏览(56)
  • 【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】二、入门知识讲解 (引用、内联函数、auto、基于范围的for循环、指针空值

    2024年02月04日
    浏览(40)
  • C++类与对象&&this指针

    从此篇往后,开始了C++的类和对象的篇章,嗯就说这么多 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现, 会发现struct中也可以定义函

    2024年02月02日
    浏览(46)
  • 0062__对象指针为NULL,为什么还是可以调用成员函数

    对象指针为NULL,为什么还是可以调用成员函数_空对象指针为什么能调用函数_一颗石头崽儿的博客-CSDN博客

    2024年02月10日
    浏览(46)
  • 【c++】类和对象(二)this指针

    🔥 个人主页 :Quitecoder 🔥 专栏 :c++笔记仓 朋友们大家好,本节内容来到类和对象第二篇,本篇文章会带领大家了解 this指针 首先我们定义一个日期类date: 我们来思考这么一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,也就是说,d

    2024年04月11日
    浏览(70)
  • 【C++】:类和对象(上)+ this指针

    【本节目标】 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题 C++是基于面向对象

    2024年02月08日
    浏览(40)
  • c++静态变量成员函数和全局函数的区别

    静态成员函数和全局函数在某些方面是相似的,但它们有一些关键的区别。 静态成员函数是与类相关联的函数,但它们不依赖于特定的类实例 。这意味着它们可以 在没有类实例的情况下被调用 ,并且没有隐含的this指针。静态成员函数可以通过类名直接调用,例如: 静态成

    2024年02月08日
    浏览(61)
  • 【C++】类和对象详解(类的使用,this指针)

    提示:这里可以添加本文要记录的大概内容: 在计算机编程领域,程序设计的方法论不断演化,从最初的面向过程到如今更为强大而灵活的面向对象。本文将深入探讨C++中关于类和对象的概念,为读者提供对面向对象编程的深刻理解。 提示:以下是本篇文章正文内容,下面

    2024年02月02日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包