#include <iostream> using namespace std; class time { public: time(int,int,int); int hour; int min; int sec; void get_time(); }; time::time(int h,int m,int s) { hour=h; min=m; sec=s; } void time::get_time () { cout<<hour<<":"<<min<<":"<<sec<<endl; } int main() { time t1(10,13,56); int *p1=&t1.hour; //指向数据成员的指针 cout<<*p1<<endl; // cout << 10 time *p2=&t1; //p2指向对象t1的 p2->get_time(); //通过指针调用成员函数 cout<<p2<<endl; void(time:: *p3)(); p3=&time::get_time; //(t1.*p3)(); cout<<p3<<endl; cout << &time::get_time << endl; printf("%x\n",p3); return 0; }
问题:
问题1:cout<<p2<<endl;改成 cout<<*p2<<endl; 为什么会报错?
问题2:cout<<p3<<endl; 为什么p3的值是1?难道公用成员函数get_time()此时的内存地址是1?即使是1也应该写成十六进制 000001的形式才对啊。
解答:
问题1:类外对<<并未重载,所以无法输出 *p2即t1;
问题2:因为取出来的那个地址,是一个void(A:: *)()类型,并不是普通的指针。然后使用cout 输出这个类型,cout可能直接当成bool型输出了。
因为cout << 能接受那么多类型是靠重载,但是肯定没 void(A:: *)()类型的重载
可是试试用Printf()替换,来输出,看地址。
到C++以后已经没有任何东西是默认的了。
C89可以不写函数返回值,变量类型,直接默认int,现在统统不行。