在执行function指针时,使用地址运算符与不使用它的目的是什么?
对于以下代码段,我为什么要使用一个赋值与另一个赋值? 谢谢
void addOne(int &x) { x +=1; } void (*inc)(int &x) = addOne; // what is the purpose of doing "addOne" void (*inc)(int &x) = &addOne; // vs &addOne ?? int a = 10; inc(a);
一个在另一个的目的是C兼容性。 C表示函数会自动衰减为指向函数的指针。 为了兼容,C ++必须做同样的事情。
请注意,当C ++引入了新的函数指针类型(成员函数指针)时,它们不会自动衰减。 因此,如果C ++委员会有他们的方式,那么你需要那么好的机会。
简洁,风格。 调用它们时使用*
也是一样的。
另请注意array
vs &array[0]
。
从C ++ Programming Languauge一书中可以清楚地看出 , &
和*
运算符是函数指针的可选项:
一个函数只能做两件事:调用它并获取它的地址。 通过获取函数的地址获得的指针然后可用于调用该函数。 例如:
void error (string s) { /* ... */ } void (*efct )(string ); // pointer to function void f () { efct = &error ; // efct points to error efct ("error "); // call error through efct }
编译器会发现efct是一个指针并调用指向的函数。 也就是说,使用*取消引用函数的指针是可选的。 同样,使用&来获取函数的地址是可选的:
void (*f1 )(string ) = &error ; // ok void (*f2 )(string ) = error ; // also ok; same meaning as &error void g () { f1 ("Vasa"); // ok (*f1 )("Mary Rose"); // also ok }
正如其他人所指出的,在C ++中, 指向成员函数的指针是新的/不同的。 &
不是指向成员的可选项,它被解释为(在C ++ Programming Languauge Book中):
可以通过将address-of运算符&应用于完全限定的类成员名称来获取指向成员的指针,例如&Std_interface :: suspend。
一个函数已经是一个指针; 因此,您不需要地址运算符。