IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 类成员中隐藏的this指针(C ++入门笔记二) -> 正文阅读

[C++知识库]类成员中隐藏的this指针(C ++入门笔记二)

一. this指针的引出

首先我们来看以下代码:

#include <iostream>

using namespace std ;

class Data{
public :
    void disPlay()
    {
        cout << _year << " - " << _month << " - " << _days << endl;
    }
    void setDays(int year,int month ,int day)
    {
        _year = year  ;
        _month = month ;
        _days = day ;
    }
private :
    int _year ;
    int _month;
    int _days ;
};

int main()
{
    Data d1 ;
    Data d2 ;
    d1.setDays(2021 , 10 ,10) ;
    d2.setDays(2021, 10 , 20) ;
    d1.disPlay() ;
    d2.disPlay() ;
}

对于上述类,有这样的一个问题:
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分------------函数体都是放在公共代码区,那当d1调用SetDate函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
所以C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
在这里插入图片描述
还有此处并不是给类成员变量赋值,而是给对象的成员变量赋值, 所以编译器才在作用域内加this指针,用this指针解引用访问对象的成员变量。

上述术语转换成代码 :

//C++ 编译器给每个“非静态的成员函数:增加一个隐藏的指针参数。
//调用这些函数的时,相当于隐式的传啦对应对象的由this指针接收。
void disPlay(Date* this)
    {
        // 故这样就能很好的访问各自的成员变量
        cout << this._year << " - " << this._month << " - " << this._days << endl;
    }
    void setDays(Data* this,int year,int month ,int day)
    {
 // 故这样就能很好的设置各自的成员变量。 
        this._year = year  ;
        this._month = month ;
        this._days = day ;
    }

强调一点题外话,类里面的成员变量只是声明, 并没有为它们开辟空间。 容易令人无解的是, C++ 11 当中为无参构造函数打啦补丁, 会给类成员赋初值,但此初值并非我们所想的初值,而是缺省值,故这并不能代表是定义类中的成员变量。 当程序员调用无参构造函数时,默认的构造函数并不会给类成员变量赋初始值,如果有这些缺省值,就使用这些缺省值初始化,当然以上讨论的是基本类型若是自定义类型,编译器会调用自定义类型的无参构造函数来为自定义类型初始化

二 . this指针的特性

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。(大家可以通过反汇编的方法来进行验证)

三. 关于this指针的相关问题

this指针可以为空吗?带着这个问题考虑一下代码。

// 1.下面程序能编译通过吗?
// 2.下面程序会崩溃吗?在哪里崩溃
class A
{
public:
void Show()
{
    cout<<"Show()"<<endl;
}
    private:
    int _a;
};
int main()
{
    A* p = nullptr;
    p->Show();
}

在这里插入图片描述
很奇怪,程序并没有报错,反而正确的运行啦,why?
在解释这个结果之前我们要知道类中的成员函数并不是存储在对象当中,而是存储在公共代码区
当p指针调用Show()函数时, 并不会去访问p指向的空间,不存在空指针解引用,这里只会把p传递给隐含的this指针,但是Show函数中也没有解引用this指针,只是简单的打印Show这个字符串。故程序正常运行。

若将代码改写一下。

#include <iostream>

using namespace std; 

class A
{
public:
    void PrintA()
    {
        cout << _a << endl;
    }
    private:
    int _a;
};
int main()
{
    A* p = nullptr;
    p->PrintA();
}

在这里插入图片描述
注意报错的地方, 该行代码显式的写应该是这样c cout << this._a << endl;程序错误的导致空指针解引用,报错啦。 两段代码的区别显而易见。
总结, this指针是可以为空, 但要视情况而定。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:20:07  更:2021-10-11 17:20:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:56:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码