首页 > 试题广场 >

下列程序的运行结果是0.请为横线处选择合适的程序()

[单选题]

下列程序的运行结果是0.请为横线处选择合适的程序()

#include <iostream>
#include <cmath>
using namespace std;
class Base {
public:
	Base(int X = 0);
	Base(Base &p);
	static void GetC(Base a1, Base a2) {
		cout << a2.X - a1.X;
	}
private:
	int X;
};
Base::Base(int XX) {
	X = XX;
}
Base::Base(Base &p) {
	X = p.X;
}
int main() {
	Base a1(5);
	Base a2(a1);
	__________ = Base::GetC;
	(*q)(a1, a2);
	return 0;
}


  • void (Base::*q)(Base,Base)
  • void *q(Base,Base)
  • void *q()
  • void (*q)(Base,Base)
C++指向函数的指针定义方式为:
返回类型  (*指针名)  (函数参数列表)  ,例如 void (*p)(int)是指向一个返回值为void 参数为int类型的函数
对于指向成员函数的指针略有不同:

1.指向非静态成员函数:
定义方式:返回类型 (类名::*指针名)(函数参数列表)例如void (A::*p)(int)是一个指向A类中成员函数的函数指针。

赋值方式:p=&A::函数名,而一般的函数指针的赋值是p=函数名即可,注意区别。(成员函数必须是public类型的)

调用方式:成员函数指针的调用必须通过类对象进行调用,a.*p(int)即可调用成员函数(该成员函数是public类型的)

1.静态成员函数

对于静态成员函数的定义和使用方法都与普通函数指针的相同,只是在赋值的时候和非静态成员们函数指针的赋值方法相同。

因为静态成员函数的指针类型是与普通函数指针类型相同的。

因此,选项A为指向非静态成员函数时的写法;B、C格式错误;D为指向静态成员函数时的写法
发表于 2017-08-21 22:34:10 回复(7)
榜首说的挺好,做一下补充。
静态与普通变量即函数的区别就是在声明部分有无类名,即:
普通成员变量:返回类型 (类名::*指针名)=
静态成员变量:返回类型 (*指针名)=
需要注意,初始化静态成员变量要在类外初始化,不能在声明时直接赋值
并且,调用静态成员变量的时候,不需要加对象名,直接*指针
另外,因为优先级的原因,调用成员函数指针的时候括号不能少
举例说明:
class Class
{
public:
	int i = 1;
	static int j;
	static const int k= 3;
	void fun()
	{
		cout << "成员函数" << endl;
	}
	static void staticfun()
	{
		cout << "静态成员函数" << endl;
	}
	
};
int Class::j = 2;                       //静态成员变量初始化
void main()
{
	Class c;
	//变量指针
	int (Class::*p1) = &Class::i;		//普通成员变量指针
	int (*p2) = &Class::j;				//静态成员变量指针
	const int (*p3) = &Class::k;		//静态成员常量指针
	//函数指针
	void(Class::*p4)() = &Class::fun;	//普通成员函数指针
	void(*p5)() = &Class::staticfun;	//静态成员函数指针
    //指针调用
	cout << c.*p1 << endl << *p2 << endl << *p3 << endl;
	(c.*p4)();
	(*p5)();
}


编辑于 2019-08-10 15:59:31 回复(4)
静态成员函数不用加作用域非静态成员函数要加作用域
发表于 2021-07-02 16:49:30 回复(0)
注意,该题中的函数为静态成员函数。A为非静态成员函数写法,D采薇静态成员函数写法
发表于 2019-07-13 10:05:53 回复(0)
静态成员函数和普通函数一样,不用加类作用域,而非静态成员函数,要加类作用域
编辑于 2024-03-18 16:23:20 回复(0)
主函数定义的是非类成员函数😅
发表于 2023-03-02 13:25:22 回复(0)
有个疑问:静态成员函数可以完全与普通成员函数的处理一样,其指针的定义不需要添加类的域名;指针的赋值可以需要也可以不需要取地址符&;指针的调用不需要通过对象调用:

class Base
{
public:
    Base(int X = 0);  // Constructor
    Base(Base &p);    // Copy constructor
    static void GetC(Base a1, Base a2)
    {
        cout << a2.X - a1.X << endl;
    }

private:
    int X;
};
Base::Base(int XX)
{
    X = XX;
}
Base::Base(Base &p)
{
    X = p.X;
}

int main(void)
{
    Base a1(5);
    Base a2(a1);
    void (*q)(Base, Base) = &Base::GetC;  // 函数指针: &
//    void (*q)(Base, Base) = Base:: GetC; // 函数指针:无 &
//    void (*q)(Base, Base);
//    q = &Base::GetC;
    (*q)(a1, a2);  // 指针调用函数
    return 0;
}

发表于 2020-02-27 21:18:38 回复(0)

当时有点困惑的地方在于,那句赋值只是说了Base::GetC 但又没说赋值哪个Get c,理由是因为Base公共的代码同时它又是静态的,所以直接赋值就好,但是还有一点疑惑的地方为什么没有取趾符

发表于 2019-10-09 16:10:35 回复(1)
函数指针,
发表于 2017-08-09 15:20:57 回复(0)