xiexiaohu
中级用户
积分 365
发帖 95
注册 2004-2-28
状态 离线
|
『楼 主』:
ZT C++/VC学习笔记
C++/VC学习笔记
[C++]
1、函数重载:
所谓函数重载是指同一个函数名可以对应着多个函数的实现。
函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载。
2、在C和C++中,有三种使用存储区的基本方式:
1)静态存储区(Static Memory)
在静态存储区中,连接器(linker)根据程序的需求为对象分配空间。全局变量、静态类成员以及函数中的静态变量都被分配在该区域中。一个在该区域中分配的对象只被构造一次,其生存期一直维持到程序结束。在程序运行的时候其中的地址是固定不变的。在使用线程(thread,共享地址空间的并发物)的程序里,静态对象可能会引起一些问题,因为这时的静态对象是被共享的,要对其正常访问就需要进行锁定操作。
2)自动存储区(Automatic Memory)
函数的参数和局部变量被分配在此。对同一个函数或区块的每一处调用,其在该区域内都有自己单独的位置。这种存储被自动创建和销毁;因而才叫做“自动存储区”。自动存储区也被称为是“在栈上的(be on the stack)”。
3)自由存储区(Free Store)
在该区域中,程序必须明确的为对象申请空间,并可以在使用完毕之后释放申请到的空间(使用new和delete运算符)。当程序需要其中更多的空间时,就使用new向操作系统提出申请。通常情况下,自由存储区(也被称作动态存储区或者堆(heap))在一个程序的生存期内是不断增大的,因为其间被其它程序占用的空间从来都不被归还给操作系统。
3、关于传值与传址及引用:
传值是在被调用函数所在区域做一个被传参数的拷贝,既然是拷贝了被传参数,那么在函数中对形参的改变不会影响到被传参数.也就是说函数的参数不具备返回值的能力.
传值调用.把实参的右值(即内容,不可被赋值)传递进来,所以函数内部改变形参不会影响实参.
传址是指传送的对象为指针或引用,再传递时被调函数得到的是被传数据的地址,在被调函数中对原被传数据的地址直接进行操作将影响到实参的值,实参的值有可能被改变.
传址调用。把实参的左值(即地址,可被赋值)传递进来,所以函数对形参的改变,相当于直接修改了实参地址里的内容。c中没有引用,传址功能可以实现c++中的引用。
下列程序显示了引用参数与非引用参数之间的差别:
void FuncA(int& Param) //reference parameter
{
++Param;
}
void FuncB(int Param) //nonreference parameter
{
++Param;
}
void main(void)
{
int N=0;
FuncA(N); //N passed by reference
//here,N equals 1
FuncB(N); //N passed by value
//here,N still equals 1
}
4、指针与引用(reference):
指针的提领(dereference,"指向"的意思)标记 * 用在声明中,表示声明的对象是指针;用在表达式中,表示取指针所指向的那个元素。
引用的标记 & 用在声明中,表示声明的对象是一个引用;用在表达式中,叫做取址运算符,表示取得对象所在的内存地址,而非对象的值。& 操作符前后的空白无意义。声明为引用的变量是另一个变量的别名。可以用“&”操作符声明引用。
指针是指向目标内存位置的地址的内存变量,而引用变量直接指向目标内存地址(与指定初始化的变量相同),它是被引用变量的别名。
5、inline函数:
如果用inline关键字声明函数,例如:
inline int FuncA(int X)
{
//function code...
}
编译器想把对这个函数的所有调用换成实际函数码.
inline函数类似于用#define预处理器命令定义的宏功能。例如,下列返回整数绝对值的inline函数
inline int Abs(int N)
{
return N<0?-N:N;
}
类似于宏功能
#define Abs(N) ((N)<0?-(N)screen.width-300)this.width=screen.width-300'>N))
但是,调用inline函数是由编译器处理的,而调用宏功能是由预处理器通过简单的文本替换完成扩展的。因此,inline函数比宏功能有二个重要的优势:
第一,调用函数时,编译器检查传递参数的类型(如上例所示确保其为整型或可变为整型的值);
第二,如果表达式传递到函数,则只求值一次。相反,如果表达式传递到宏功能,则它在宏中出现几次就求值几次,可能产生意外的副作用。
————————————————————————————————
[VC/MFC]
1、大致说来windows编程有两种方法:
a.windwos c方式(SDK),SDK编程就是直接调用windows的API进行编程;
b.c++方式:即对SDK函数进行包装,如VC的MFC,BCB的OWL等。MFC把这些API封闭起来,共有一百多个类组成.
2、API,全称application program interface,意思是应用程序编程接口(说起API并不仅仅指windows而言, windows支持的API叫winapi)。winapi就是应用程序和windows之间通讯的一个编程界面。windows提供了上千个API函数,以方便程序员来编写应用程序。
3、WinSDK程序设计就是API方式的windows程序设计。SDK,全称Software Developers Kit,意思是软件开发工具箱。
4、MFC,全称Microsoft Foundation Classes,伪软把WinAPI进行封装的类库。它是一个类的集合,通过覆盖WinAPI,为编程提供了一个面向对象的界面。它使windows程序员能够利用C++面象对象的特性进行编程,类似BCB的OWL,Delphi的VCL组件。它把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现。你不妨把它想象成类似TC提供的函数库吧。
5、dos下的C编程的main()一样,windows下的入口是WinMain()函数。
6、WinMain()所起的作用:初始化,展示,销毁应用程序等。
第一个参数:应用程序的当前实例句柄。
第二个参数:应用程序的前一个实例句柄,别管它,对于Win32位而言,它一般是NULL.
第三个参数:指向任何传给程序的命令行参数。PSTR代表"指向字符串的指针"。
第四个参数:它告诉应用程序如何初始化窗口,如最大化,最小化等状态。
7、句柄(handle):
在标准C库中句柄用来对文件输入输出。
在Windows环境中,句柄是用来标识项目的,这些项目包括:
*.模块(module)
*.任务(task)
*.实例(instance)
*.文件(file)
*.内存块(block of memory)
*.菜单(menu)
*.控制(control)
*.字体(font)
*.资源(resource),包括图标(icon),光标(cursor),字符串(string)等
*.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画 笔(pen),区域(region),以及设备描述表(device context)。
WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
窗口句柄:
系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。
8、所有的命名采用了匈牙利表示法。如消息的前缀使用msg.句柄使用h.函数使用fn等。
9、MainFrm.cpp、MainFrm.h:
这两个文件将从CFrameWnd(SDI应用程序)或CMDIFrameWnd(MDI应用程序)派生CMainFrame类。如果在AppWizard的Application Options页(6步中的第4步)中选择了对应的可选项的话,CMainFrame类将处理工具条按钮和状态条的创建。MAINFRM.CPP文件还含有MFC应用程序提供的默认工具条按钮的对象ID——叫做buttons数组。
10、DOS程序主要使用顺序的,过程驱动的程序设计方法。顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序。虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构。
11、Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的。做为一个程序员,在你编写程序时,你并不知道用户先按哪个按纽,也不知道程序先触发哪个消息。你的任务就是对正在开发的应用程序要发出或要接收的消息进行排序和管理。事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。
12、Windows程序则至少两个主程序,
一个是WinMain(),
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
);
另一个是窗口过程函数WndProc,它的函数原型为:
long FAR PASCAL WndProc(HWND hWnd,WORD message,WORD wParam,LONG lParam);
13、窗口函数与回调函数:
在Windows中,应用程序通过要求Windows完成指定操作,而承担这项通信任务的API函数就是Windows的相应窗口函数WndProc。应用程序不直接调用任何窗口函数,而是等待Windows调用窗口函数,请求完成任务或返回信息。为保证Windows调用这个窗口函数,这个函数必须先向Windows登记,然后在Windows实施相应操作时回调,所以窗口函数又称为回调函数。WndProc是一个主回调函数,Windows至少有一个回调函数。典型的回调函数有窗口过程、对话框过程和钩子函数。实际上,也许有不止一个的窗口过程。例如,每一个不同的窗口类都有一个与之相对应的窗口过程。
15、实例:在Windows中,能多次同时运行同一个应用程序,即运行多个副本,每个副本叫做一个“实例”。
16、C runtime函数库:
就跟它的名字一样,运行类型信息
主要有COject类和CRuntimeClass类来实现,用来存贮COject类和派生类的运行类型信息,
1.类的基本情况:如类的名字,存贮空间大小,用于运行类的类型确定.
2.ms在C++的标准上,添加动态创建的类对象功能,也就是时时提到的动态创建
3.串行化处理.
The OS does not know main(), so C-runtime is first called and transfer control to main
it also provide library for common usage, such as math functions
17、WinMain()函数的调用约定是PASCAL。
在这里PASCAL是一个调用约定,由于这种方式最早由PASCAL采用,所以这么叫。
在MSDN中的C++ Language Reference中,Calling Conventions这一章都是讲调用约定的。
约定:微软重定义了许多约定类型,为的是可以让代码更容易跨平台或者跨编译器。
其实,调用约定要解决两个问题,都是针对堆栈操作:
1。参数传递的顺序(本质是压栈的顺序)
2。谁负责平栈(调用者还是调用对象)
一个函数的声明、定义和实现中的调用方式一般都一致。
WINAPI标识符的定义是:#define WINAPI __stdcall, __stdcall指Window调用函数的一种方式,也就是如何在堆中存取函数参数的方式。许多Windows Api函数调用声明为__stdcall方式。
18、用位的“或”操作(操作符“|”)把若干个常数组合起来控制消息窗口显示的按钮和图标等。
19、在Windows应用程序中,每一个窗口都必须从属于一个窗口类,窗口类定义了窗口所具有的属性,如它的样式、图标、鼠标指针、菜单名称及窗口过程名等。
窗口种类是定义窗口属性的模板,这些属性包括窗口式样,鼠标形状,菜单等等,窗口种类也指定处理该类中所有窗口消息的窗口函数.只有先建立窗口种类,才能根据窗口种类来创建Windows应用程序的一个或多个窗口.创建窗口时,还可以指定窗口独有的附加特性.窗口种类简称窗口类,窗口类不能重名.在建立窗口类后,必须向Windows登记.建立窗口类就是用WNDCLASS结构定义一个结构变量.
20、Visual C++提供Alt+F8功能键,进行文件规格化,根据周围的代码行,正确缩进选定的代码行。常使用该按键可使得文件保持规格化(注,Alt+F8功能键对连续两个CASE语句则会发生处理错误,不能规格化)。
21、消息:
一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。
22、一个典型的应用程序应该活动在称为“框架窗口”中。一个框架窗口是一个全功能的主窗口,用户可以改变尺寸、最小化、最大化等。
23、消息机制:
系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。
24、预编译头文件:
VC++程序一般包含的头文件都比较复杂,如果每次都逐行分析可能会花很多时间,所以VC++默认设置是第一次编译时分析所有头文件,生成.pch文件,这个文件很大,但以后每次编译时就可以节省很多时间。如果删除了这个文件,下次编译时VC++会自动生成它。
StdAfx.h是每个MFC程序的类中必须包括的文件,它一般由AppWizard自动生成,包括编译MFC类所必须的定义。
25、Windows支持两种类型的对话框:模式和无模式对话框。
模式对话框一旦出现在屏幕上,只有当它退出时,屏幕上该应用程序的其余部分才能响应。
无模式对话框出现在屏幕上时,程序的其余部分也可以作出响应,它就象浮动在上面一样。
26、单文档界面(SDI),只有一个框架窗口。
MDI 系统允许用户在同一应用程序中同时可以查看多个文档。
27、,MFC 中的大部分类都是从基类 CObject 中继承下来的。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。该类包含有大部分MFC类所通用的数据成员和成员函数。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。
|
|