被 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}又是一个什么神奇的数组,翻了半天书也没看出个所以然,上网查也不知道用什么关键词,有没有懂的大佬能帮我一下。

5315 次点击
所在节点    C++
43 条回复
jmc891205
2020-10-25 22:38:41 +08:00
取址操作符
指针数组
rainboat
2020-10-25 22:50:33 +08:00
@jmc891205 按理说 abc 都是类的成员变量,没有对象的话这些变量也是不存在的,为啥可以对其进行取址操作呀
ysc3839
2020-10-25 22:51:04 +08:00
codehz
2020-10-25 22:52:26 +08:00
jmc891205
2020-10-25 22:56:52 +08:00
@rainboat

A pointer to non-static member object m which is a member of class C can be initialized with the expression &C::m exactly. Expressions such as &(C::m) or &m inside C's member function do not form pointers to members.

https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members
jmc891205
2020-10-25 22:57:10 +08:00
@jmc891205 哦楼上发过了
rainboat
2020-10-25 23:00:41 +08:00
@ysc3839
@codehz
@jmc891205
感谢感谢
GeruzoniAnsasu
2020-10-25 23:18:47 +08:00
类成员指针是一个偏移量



输出 1 的原因是只能找到 bool 的 <<重载



要用类成员指针必须有一个实例对象,以 object -> *ptr 的方式使用
52coder
2020-10-25 23:22:48 +08:00
@GeruzoniAnsasu 正解,cout << &Test::c << endl;不管哪个成员都是 1,跟 v 和 f 函数没关系。
codehz
2020-10-25 23:37:52 +08:00
@GeruzoniAnsasu 不一定是偏移量,具体值是实现定义
考虑一下虚继承,其中任意子类拿出来都要可以->*方式访问
by73
2020-10-26 00:00:44 +08:00
> An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool.
> 来源 https://stackoverflow.com/a/25553119

难怪会被转成 bool 。。

偏个题:你这是考语言律师资格证嘛😂
GeruzoniAnsasu
2020-10-26 01:35:44 +08:00
@by73 又是那句老话了 编译器行为学是 c++的一部分,务必品尝 doge
elfive
2020-10-26 07:57:36 +08:00
指向成员变量的指针这语法……真的有用到生产环境吗?

现在有个趋势,感觉会把人搞懵逼的:静态语言开始融合部分动态语言的特点,动态语言也开始慢慢吸收静态语言的部分特点

像我这种人真不是很能理解……虽然之前的语法规则也都能用
user8341
2020-10-26 08:24:10 +08:00
@elfive +1,这种语法的使用场景是什么?
byaiu
2020-10-26 08:28:14 +08:00
@elfive 用在一些库的核心部分吧。看过 ns3,它的 attribute 的部分就用了这个,结合了 macro 和 template 实现了类似 qt 的 property 的功能。
codehz
2020-10-26 08:47:42 +08:00
@elfive 当然有,甚至很多属于非开源的代码库。。。
举个例子,根据逆向工程结果(实际上是符号表里直接看到的),mc 基岩版在处理指令注册的时候使用这个方法把类中的成员注册成指令的参数,这样,指令解析程序就可以在解析指令文本的时候把参数填入那个类了,不使用这个方法,你就需要写一大堆包装函数(虽然实质上确实用模板生成了他们)
zsxzy
2020-10-26 09:11:57 +08:00
c++ primer 都有讲到
fps23dot9999
2020-10-26 09:32:18 +08:00
放心,考研绝 B 不会考
zzlhr
2020-10-26 09:57:27 +08:00
看看指针部分吧
codyfeng
2020-10-26 10:40:37 +08:00
越写 c++越不敢说自己会 c++

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

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

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

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

© 2021 V2EX