理解指向成员运算符的指针 我从一本C++练习册上抄袭了这个程序。幕后发生了什么
预期产出为: 总和=30总和=70理解指向成员运算符的指针 我从一本C++练习册上抄袭了这个程序。幕后发生了什么,c++,pointers,compiler-errors,dereference,pointer-to-member,C++,Pointers,Compiler Errors,Dereference,Pointer To Member,预期产出为: 总和=30总和=70 #包括 使用名称空间std; M类 { int x; int-y; 公众: 无效集_xy(整数a,整数b) { x=a; y=b; } 朋友整数和(M); }; 整数和(M); //到目前为止还不错,问题从这里开始。在这里之后发生了什么? { int M::*px=&M::x; int M::*py=&M::y; M*pm=&M; int s=m*px+pm->*py; 返回s; } int mai
#包括
使用名称空间std;
M类
{
int x;
int-y;
公众:
无效集_xy(整数a,整数b)
{
x=a;
y=b;
}
朋友整数和(M);
};
整数和(M);
//到目前为止还不错,问题从这里开始。在这里之后发生了什么?
{
int M::*px=&M::x;
int M::*py=&M::y;
M*pm=&M;
int s=m*px+pm->*py;
返回s;
}
int main()
{
M n;
void(M::*pf)(int,int)=&M::set_xy;
(n.*pf)(10、20);
cout问题是由于op->*pf
处的额外空格造成的:
(op->*pf)(30,40); // ok
我认为@fefe可能在评论中提到了原因。->*
是一个单独的运算符,类似于*
。因此,如果这两个运算符分开,则会导致不同的语法,从而导致编译器错误。请看一看。对于错误,->*是一个运算符,您不能在它们之间加空格。打赌我会出错;op->*pf
必须更改,以便将->*
作为单个运算符-a(找不到更好的链接)。op->*pf
中的空格完全有效
类似于i++
;++
是一个单独的运算符,如果尝试使用i++
,则会导致错误
现在来看看它在做什么。这个例子是一个指向成员函数的指针。pf
被声明为class M
的成员函数,它使用两个int
参数,返回类型为void
。它被初始化为指向M::set_xy
函数
内部main
:
n
属于M
类型,因此,为了使用pf
调用set_xy
的n
的*
操作符:(n.*pf)(10,20);
。这相当于n.set_xy(10,20);
- 由于
op
属于M*
类型(指向M
对象的指针),因此需要使用->*
操作符,并将pf
指向的函数调用为:(op->*pf)(30,40);
,这相当于op->set_xy(30,40);
内部总和:
- 这些示例只是指向成员/实例变量的指针,而不是成员函数。它只是演示如何使用这些类型的指针将
m.x
和m.y
相加
“->*”是一个运算符,而不是两个运算符。因此它们不能分开。您不能写入“->*”。该问题已解决。请有人解释一下它的工作原理吗?删除标记“visual studio”,因为它不是编译器的特定问题。ignore();getchar()是Visual Studio .jeT.Mg的命令,是命令,是VS,但不是编译器错误问题,我读到C++中不关心空白的地方。我们试试如果它工作。@ JeET.MG:操作符是代码> > *>代码>。你不能把空间放在你喜欢的地方(比如<代码> Dele Te/Cuff>不与<代码>删除< /代码>相同)这个问题解决了。有人能解释一下它的工作原理吗?@jeet.mg,这是一个不同的问题。你可能需要先看看你的代码,如果不理解,你可以发布另一个问题。
(op->*pf)(30,40); // ok