(C++)对象中方法

C++的类中的方法是否有地址,改怎么取地址
在类的方法中使用static修饰变量,对象1对方法中静态变量自增,同类下的方法2中的静态变量会接着方法1中的静态变量继续自增
两个对象的方法是否存储在同一个地址下

img

在C++中,类中的方法是有地址的,因为类的方法本质上是函数。可以通过函数指针来获取类的方法地址。

例如,假设有一个类Foo,其中有一个成员函数func,可以通过以下方式获取该函数的地址:


Foo f;
void (Foo::*funcPtr)() = &Foo::func;

这里使用了成员函数指针的语法,将func函数的地址存储在funcPtr变量中。在调用该函数时,需要通过对象指针或对象引用来调用,例如:


(f.*funcPtr)();

关于类中的静态变量,静态变量是类的所有对象共享的,因此在一个对象的方法中修改静态变量的值会影响到其他对象的静态变量的值。这也就是为什么在题目中描述的情况下,对象1对静态变量自增之后,同类下的对象2的静态变量会接着自增。这是因为静态变量在程序的整个生命周期内只有一份,而且在类定义中被声明为static时,它们不是对象的一部分,而是与类本身相关联的。

关于类的方法的地址,不同的对象调用同一个类的方法时,它们所调用的方法是在内存中存储在不同的地址中的,因此两个对象的方法并不存储在同一个地址下。

成员函数属于类, 所以只有一个共有地址.

非static数据成员属于对象,会有不同地址.

#include <cstdio>
#include <iostream>

struct test
{
    void print()
    {
        std::cout << "test::print" << std::endl;
    }
    int testMem = 0;
};

auto main() -> int
{
    auto testMemFunc = &test::print;

    test t1, t2;

    (t1.*testMemFunc)();

    (t2.*testMemFunc)();

    // 无法用cout输出成员函数指针地址
    printf("%p\n", testMemFunc);

    printf("%p,%p", &t1.testMem, &t2.testMem);

    return 0;
}