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

Posted 一代枭雄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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\n", this);
}

int main()
{
    Test t1(1);
    Test t2(2);
    Test t3(3);
    
    printf("t1.getMi() = %d\n", t1.getMi());
    printf("&t1 = %p\n", &t1);
    t1.print();
    
    printf("t2.getMi() = %d\n", t2.getMi());
    printf("&t2 = %p\n", &t2);
    t2.print();
    
    printf("t3.getMi() = %d\n", t3.getMi());
    printf("&t3 = %p\n", &t3);
    t3.print();
    
    return 0;
}

该实例说明:

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

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

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

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

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

 

以上是关于第24课经典问题解析(下)--------类的成员函数和成员变量隶属某个具体对象吗的主要内容,如果未能解决你的问题,请参考以下文章

24课 类的成员之字段内容梳理

C++--第14课 - 专题二经典问题解析

第25课 类的静态成员变量

第12课 经典问题解析一

第54课 被遗弃的多重继承(下)

第55课 经典问题解析