被 C++的语法问题折磨了,有没有大佬帮我解答一下疑惑

2020-10-25 22:32:01 +08:00
 rainboat
class Test{
public:
    int a, b, c;
    Test(int i){
        a = i;
        b = c = 0;
    }
    ~Test(){
        a = b = c = 0;
    }
};

int Test::*v[] = {&Test::a, &Test::b, &Test::c};

void f(Test *a, int Test::*b, int c){
    a->*b = c;
}

int main(){
    // 输出结果为 1
    cout << &Test::c << endl;
}

考研刷题时碰到的一道题中的一部分代码,我知道 Test::是类的作用域,但是这个&Test::c是个什么东西,还有这个int Test::*v[] = {&Test::a, &Test::b, &Test::c}又是一个什么神奇的数组,翻了半天书也没看出个所以然,上网查也不知道用什么关键词,有没有懂的大佬能帮我一下。

5342 次点击
所在节点    C++
43 条回复
codehz
2020-10-26 23:00:42 +08:00
@Tony042 还是有点关系的,std::bind 也可以应用于指向成员的指针
std::bind(&Test::a, _1)是可行的(相当于拿到了一个 int &(Test&)的函数)
littlewing
2020-10-26 23:29:14 +08:00
果然这辈子都学不会 c++了
Wirbelwind
2020-10-27 13:32:54 +08:00
@Tony042

x64 上,对成员函数,可以改变函数写法
class.func(a,b,c); -> func_converted(&class,a,b,c);
std::mem_fun (原函数最多两个参数,否则不能编译)

对成员变量,通过上面的方法可以拿到对应的成员变量
auto interface = std::mem_fn(&class::data);
interface(&class);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/718467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX