现在的位置: 首页 > 综合 > 正文

【C++】对象和指针

2013年10月14日 ⁄ 综合 ⁄ 共 867字 ⁄ 字号 评论关闭
#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,现在统统不行。

抱歉!评论已关闭.