这条语句出自第三章的Frame6范例程序->RuntimeClass的构造过程中
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
/*就是上边这句,这条语句好像是C++本身脱离VC环境就能成立的,我只知道有了这句话,
RuntimeClass结构就多了一个成员,这个成员是一个函数的指针。可是通过语法怎么也看不
出个所以然来,如果再跟CObject* CreateObject();这一句对比就更糊涂了,区别就只在一个
括号,可一个是一个函数的指针,一个却是一个函数。请哪位给指点指点。 CRuntimeClass* m_pBaseClass; CObject* CreateObject();
static CRuntimeClass* PASCAL Load(); // CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
/*就是上边这句,这条语句好像是C++本身脱离VC环境就能成立的,我只知道有了这句话,
RuntimeClass结构就多了一个成员,这个成员是一个函数的指针。可是通过语法怎么也看不
出个所以然来,如果再跟CObject* CreateObject();这一句对比就更糊涂了,区别就只在一个
括号,可一个是一个函数的指针,一个却是一个函数。请哪位给指点指点。 CRuntimeClass* m_pBaseClass; CObject* CreateObject();
static CRuntimeClass* PASCAL Load(); // CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
解决方案 »
- 如何实现在MSFlexGrid控件中添加数据时实现动态增加行数,而且滚动条自动定位到最后添加的那一行(高分送!!!)
- CFormView的派生类,应该在哪儿初始化界面的东西?
- 钩子无法截获其他窗口的消息(100求救)
- 我刚开始学VC希望推荐几本书
- 买了新手机,散分
- 打印时怎样控制打印的文档在页面上的合适位置?换页时又该怎样控制?
- 请问那里能下载到《Programming Windows》by Charles Petzold.
- 下载了FREE BSD后,其中有带一个CHECKSUM.md5文件不知道用何工具? thank you!
- 这是什么问题? Unhandled exception in test.exe(KERNEL32.DLL):0xEEDFADE:(no name)
- 十进制转换十六进制
- CString GetBuffer以后调用ReleaseBuffer可以重新计算长度,STL的string有类似的功能吗?
- 重载构造函数时,初始化列表会被覆盖
先看例子:
//
#include int max(int x,int y){ return(x>y?x:y); } void main()
{
int (*ptr)();
int a,b,c;
ptr=max; //注意这行
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
//
那函数怎么可以赋值给函数指针?难道int可以赋值给int* ?
//
函数指针里面放的什么?函数入口地址。
那么函数指针就是放函数入口地址的变量?
而函数是什么?显而易见,是放函数入口地址的常量。
这样一来就好解释了!函数赋值给函数指针就像把常量赋值给同类型变量!
//
再看看下面的代码:
//////////////////////////////////
#include
typedef int (*FN_HAHA)();
int real_haha()
{
return printf("haha\n");
}void main(int argc, char* argv[])
{
FN_HAHA haha=real_haha;
real_haha();
(*haha)();
}
//////////////////////////////////
既然 haha 和 real_haha是一个层次上的东西,
那么调用的时候为什么 一个 "real_haha();",
一个(*haha)()哩?
//////
这是语法本身的缺陷,所以现在的编译器,比如VC和gcc,
都允许用 haha();来代替传统的(*haha)();你44就知道了。
/////////////////////////////////////////
可见,函数指针与函数其实是一回事情.都是一段代码(函数体)的入口地址.