#include “iostream”
class MyClass
{
public:
void go()
{
std::cout << “go()” <,std::endl;
}
}
void main()
{
void (MyClass::*p)() = &MyClass::go;
p(); //编译通过但是不能运行,这是怎么回事呢?
std::cin.get();
}
如上所示
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
肯定不安全呀,所以本人才特意加了个注释……
1
恩,不过还是学习了~~~ -_-
2
没注意,一个颜色上乱了,重来下
#include <iostream>
using namespace std;
class MyClass
{
public:
static void go()
{
std::cout << “go()” << std::endl;
}
};
#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; ///成员函数指针
void (C::* pmemfun)( ) = &C::print; ///成员函数指针
2
string是一个类对象,并不是char*字符串,地址不一样很正常
联系仅仅在于string中有一个指针成员,这个指针指向了一个字符串而已
联系仅仅在于string中有一个指针成员,这个指针指向了一个字符串而已
2
类的非静态成员函数还有一个参数就是指向对象的指针
要调用非静态成员函数,你需要有对象
要调用非静态成员函数,你需要有对象
1
在C++ 没有支持静态成员函数的时候,呼叫静态成员函数就是传递 NULL 的 this 指针的。