• C++入门经典-例7.6-this指针,同一个类的不同对象数据


    1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的。那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针。

    2:示例代码:

    // 7.6.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    class CBook                                //定义一个CBook类
    {
    public:
        int m_Pages;                            //定义一个数据成员
        void OutputPages()                        //定义一个成员函数
        {
            //cout<<m_Pages<<endl;             //隐式调用    
            cout<<this->m_Pages<<endl;                //显式调用
        }
    };
    int main(int argc, char* argv[])
    {
        CBook vbBook,vcBook;                    //定义两个CBook类对象
        vbBook.m_Pages = 512;                    //设置vbBook对象的成员数据
        vcBook.m_Pages = 570;                    //设置vcBook对象的成员数据
        vbBook.OutputPages();                    //调用OutputPages方法输出vbBook对象的数据成员
        vcBook.OutputPages();                    //调用OutputPages方法输出vcBook对象的数据成员
        return 0;
    }
    View Code

    运行结果:

        在OutputPages成员函数中知识访问了m_Pages数据成员,每个对象在调用OutputPages方法时如何区分自己的数据成员呢?在每个类成员函数(非静态成员函数)中都隐含包含一个this指针,指向被调用对象的指针,其类型是当前类类型的指针类型,在const方法中,为当前类类型的const指针类型。当vbBook对象调用OutputPages成员函数时,this指针指向vbBook对象。当vcBook对象调用OutputPages成员函数时,this指针指向vcBook对象。

    2:在OutPutPages成员函数中,可以显式地使用this指针访问数据成员。例如:

    void OutputPages()

    {

        cout<<this->m_Pages<<endl;

    }

        实际上,编译器为了实现this指针,在成员函数中自动添加了this指针对数据成员的方法,类似于上面OutputPages方法。此外,为了使this指针指向当前调用对象,并能够在成员函数中使用,在每个成员函数中都隐式包含了一个this指针作为函数参数,并在函数调用的时候将对象自身的地址隐含作为实际参数传递。例如,以OutPutPages成员函数为例,编译器将其定义为:

    void OutputPages(CBook* this)//隐含添加this指针

    {

         cout<<this->m_Pages<<endl;

    }

  • 相关阅读:
    centos出现“FirewallD is not running”怎么办
    Centos7开放及查看端口
    phpRedis函数使用总结
    如何在Windows的PHPstudy中使用redis
    Redis命令操作详解
    不可不知 DDoS的攻击原理与防御方法
    DDoS 攻击与防御:从原理到实践
    ORM Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
    PHP常用函数大全500+
    Linux彻底卸载Nginx
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7552182.html
Copyright © 2020-2023  润新知