• 第24课经典问题解析(下)--------类的成员函数和成员变量隶属某个具体对象吗


    关于类成员的疑问
    成员函数和成员变量都是隶属于具体对象吗?
    成员变量必然是隶属具体对象的,那成员函数呢?
    是不是每个对象都有自己的一套成员函数呢?答案否

    面向对象的角度
      对象由属性(成员变量)和方法(成员函数)构成
    程序运行的角度
      对象是由数据和函数构成
        数据可以位于栈,堆和全局数据区
        函数只能位于代码段

    代码段是只读的,在程序运行阶段是不可以改变的。当编译器将最终的可执行程序编译好之后,代码段就确定了,不可以再进行更改。
    对象可以动态的创建,动态的删除,对于数据而言,当然可以做到。
    对于代码,这是不可能的。也就是说,在面向对象里面由于程序的特性,天生的决定了成员函数不可能每个对象都有一套的。只可能是所有的对象共享一套成员函数。就是因为代码段,不可能动态的添加和删除的。

    结论:
    -每一个对象都拥有自己独立的属性(成员变量)
    -所有的对象共享类的方法(成员函数)
    -方法能够直接访问对象的属性
    -方法中的隐藏参数this用于指代当前对象

    问题:如果所有的对象都共享一套成员函数,那么我们在调用成员函数的时候,函数本身它如何知道是哪个对象调用的呢?
    方法中的隐藏参数this用于指代当前调用成员函数的对象。

    用实例来证明:

    #include <stdio.h>
    
    class Test
    {
        int mi;
    public:
        int mj;
        Test(int i);
        Test(const Test& t);
        int getMi();
        void print();
    };
    
    Test::Test(int i)
    {
        mi = i;
    }
    
    Test::Test(const Test& t)
    {
        mi = t.mi;
    }
        
    int Test::getMi()
    {
        return mi;
    }
    
    void Test::print()
    {
        printf("this = %p
    ", this);
    }
    
    int main()
    {
        Test t1(1);
        Test t2(2);
        Test t3(3);
        
        printf("t1.getMi() = %d
    ", t1.getMi());
        printf("&t1 = %p
    ", &t1);
        t1.print();
        
        printf("t2.getMi() = %d
    ", t2.getMi());
        printf("&t2 = %p
    ", &t2);
        t2.print();
        
        printf("t3.getMi() = %d
    ", t3.getMi());
        printf("&t3 = %p
    ", &t3);
        t3.print();
        
        return 0;
    }

    该实例说明:

    在类的成员函数中,有一个隐藏的参数,这个参数它是一个指针,并且这个指针的值就是调用这个函数所对应的对象的地址。

    成员函数和普通函数是不一样的,成员函数有一个隐藏的参数this。

    现在可以回答上篇博客中的那个问题了。

    Test::Test(const Test& t)
    {
             mi = t.mi;
    }

    成员函数只有一套,成员函数能直接访问对应类的成员变量。拷贝构造函数是一种特殊的成员函数,因此就可以直接访问类的成员变量。因此t.mi是合法的。

  • 相关阅读:
    C# String.Format格式说明
    jQuery.json.js
    禁止别人使用"另存为"保存你的网页
    组合问题的递归算法
    jQuery,contents()
    C#string,StringBuilder和Regex类的讲解
    jQuery性能优化指南
    加密算法的C#实现
    m,n组合算法
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/-glb/p/11873881.html
Copyright © 2020-2023  润新知