关于在main函数中调用类成员函数的问题求指导

C++语言 码拜 8年前 (2016-04-20) 910次浏览
#include “iostream”
class MyClass
{
public:
void go()
{
std::cout << “go()” <,std::endl;
}
}
void main()
{
void (MyClass::*p)()  = &MyClass::go;
p();   //编译通过但是不能运行,这是怎么回事呢?
std::cin.get();
}
如上所示
解决方案

10

#include <iostream>
using namespace std;
class MyClass
{
public:
	void go()//保证这个函数不会访问MyClass的数据成员
	{
		std::cout << "go()" <<std::endl;
	}
}
;
int main (){
	void (MyClass::*p)()  = &MyClass::go;
	(((MyClass*)(NULL))->*p)();  
	std::cin.get();
	return 0;
}

5

类普通成员函数是需要有对象才能访问的,设置为static不需要对象。楼上用NULL指针完成访问,很奇怪~~ 安全不?

#include <iostream>
using namespace std;
class MyClass
{
public: static void go()//保证这个函数不会访问MyClass的数据成员
	{
		std::cout << "go()" << std::endl;
	}
};
int main (){(int argc, _TCHAR* argv[])
{
	void ( *p)() = &MyClass::go;
	p();
	std::cin.get();
	return 0;
}

1

引用:

类普通成员函数是需要有对象才能访问的,设置为static不需要对象。楼上用NULL指针完成访问,很奇怪~~ 安全不?

#include <iostream>
using namespace std;
class MyClass
{
public: static void go()//保证这个函数不会访问MyClass的数据成员
	{
		std::cout << "go()" << std::endl;
	}
};
int main (){(int argc, _TCHAR* argv[])
{
	void ( *p)() = &MyClass::go;
	p();
	std::cin.get();
	return 0;
}

肯定不安全呀,所以本人才特意加了个注释……

1

引用:
Quote: 引用:

类普通成员函数是需要有对象才能访问的,设置为static不需要对象。楼上用NULL指针完成访问,很奇怪~~ 安全不?

#include <iostream>
using namespace std;
class MyClass
{
public: static void go()//保证这个函数不会访问MyClass的数据成员
	{
		std::cout << "go()" << std::endl;
	}
};
int main (){(int argc, _TCHAR* argv[])
{
	void ( *p)() = &MyClass::go;
	p();
	std::cin.get();
	return 0;
}

肯定不安全呀,所以本人才特意加了个注释……

恩,不过还是学习了~~~  -_-

2

没注意,一个颜色上乱了,重来下
#include <iostream>
using namespace std;
class MyClass
{
public:
static void go()
{
std::cout << “go()” << std::endl;
}
};

int main (){(int argc, _TCHAR* argv[])
{
void ( *p)() = &MyClass::go;
p();
std::cin.get();
return 0;
}

2

静态函数和成员才能通过类名直接调用,不然都要通过类的实例调用

5

#include “iostream"
class MyClass
{
public:
          void go()
          {
                        std::cout << "go()" <,std::endl;
           }
}
int main()
{
      MyClass obj;
       MyClass &ref =obj;
      MyClass *ptr =&obj;
       void (MyClass::*p)()  = &MyClass::go;
       (obj.*p)(); ///1)对象调用成员函数指针(指向的成员函数)
       (ref.*p)(); ///2)引用调用
       (ptr->p)();///3)指针调用
         p();   //编译通过但是不能运行,这是怎么回事呢?
        /// 这个写法不符合成员函数指针的语法,所以不管编译能不能通过
        ///都不是正确写法 
       std::cin.get();
      return 0;
}

PS:

C++ 成员指针,语法大致如下:
///成员指针定义
C::* mp= &C:: x;//成员变量指针
C::* pmemfun = &C::print; ///成员函数指针
.*,->* ///成员指针的用法
obj.*mp;
 ref.*pm;
(ptr->*mp) ///最好加上优先级运算符 () 
(obj.*pmemfun)() ///对象调用成员函数指针(指向的函数)的用法
(ref.*pmemfun)() ///引用调用成员函数指针(指向的函数)的用法
(ptr->*pmemfun)()/// 指针调用成员函数指针(指向的函数)的用法
  

1

int C::* mp= &C:: x;//成员变量指针
void (C::* pmemfun)( ) = &C::print; ///成员函数指针

2

string是一个类对象,并不是char*字符串,地址不一样很正常
联系仅仅在于string中有一个指针成员,这个指针指向了一个字符串而已

2

类的非静态成员函数还有一个参数就是指向对象的指针
要调用非静态成员函数,你需要有对象

1

在C++ 没有支持静态成员函数的时候,呼叫静态成员函数就是传递 NULL 的 this 指针的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于在main函数中调用类成员函数的问题求指导
喜欢 (0)
[1034331897@qq.com]
分享 (0)