C++知识总结(多态,重载重写,函数指针,函数对象,虚函数等)
动态连接库的创建步骤:
一、创建Non-MFC DLL动态链接库
1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project
—>工程名:DllDemo
2、新建一个.h文件DllDemo.h
以下是引用片段: #ifdef DllDemo_EXPORTS #define DllAPI __declspec(dllexport) #else #define DllAPI __declspec(dllimport) extern "C" //原样编译 { DllAPI int __stdcall Max(int a,int b); //__stdcall使非C/C++语言内能够调用API } #endif |
3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数
以下是引用片段: #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; } |
4、编译程序生成动态连接库
二、用.def文件创建动态连接库DllDemo.dll。
1、删除DllDemo工程中的DllDemo.h文件。
2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。
3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:
LIBRARY MyDll
EXPORTS
Max@1
4、编译程序生成动态连接库。
动态链接的调用步骤:
一、隐式调用
1、 建立DllCnslTest工程
2、 将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录
3、 在DllCnslTest.h中添加如下语句:
以下是引用片段: #define DllAPI __declspec(dllimport) #pragma comment(lib,"DllDemo.lib") //在编辑器link时,链接到DllDemo.lib文件 extern "C" { DllAPI int __stdcall Max(int a,int b); } |
4、在DllCnslTest.cpp文件中添加如下语句:
以下是引用片段: #include "DllCnslTest.h"//或者 #include "DllDemo.h" void main() { int value; value = Max(2,9); printf("The Max value is %d\n",value); } |
5、编译并生成应用程序
二、显式调用
1、 建立DllWinTest工程
2、 将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。
3、 用vc/bin下的的小程序,查看DLL文件(DllDemo.dll)中的函数结构。
4、 使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。
例:
以下是引用片段: typedef int(*lpMax)(int a,int b); //此语句可以放在.h文件中 |
5、 通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。
例:
以下是引用片段: HINSTANCE hDll; //声明一个Dll实例文件句柄 hDll = LoadLibrary("DllDemo.dll");//导入DllDemo.dll动态连接库 |
6、 通过GetProcAddress()函数获取导入到应用程序中的函数指针。
例:
以下是引用片段: lpMax Max; Max = (lpMax)GetProcAddress(hDLL,"Max"); int value; value = Max(2,9); printf("The Max value is %d",value); |
7、 函数调用完毕后,使用FreeLibrary()卸载DLL文件。
FreeLibrary(hDll);
8、 编译并生成应用程序
注:显式链接应用程序编译时不需要使用相应的Lib文件。
************重载与重写的区别
重载发生于同一个作用域内有两个或更多个函数具有相同的名字,但签名不同时。函数的签名由它所声明的参数/形参 的数目和类型构成。当编译器在一个作用域内查一个函数名时,发现不止一个函数具有该名字,它就会在该作用域的可用候选函数中,选择形参与函数调用中的实参有着最佳匹配的那一个函数。
重写发生于派生类函数和基类虚函数具有相同的名字和签名时。在这种情况下,派生类函数的实现将会取代它所继承的积累函数的实现,以便满足对派生对象的虚拟调用。重写机制改变类的行为而不是改变类的接口。
*****************const使用
1 const double * cptr;//cptr 是一个指向double类型的const对象的指针
cptr本身不是常量,我们可以改变它的指向,但是不能改变它所指向的对象的值;
2 const对象的地址只能付给,指向常量的指针,但一个指向常量的指针可以指向一个非常量,但是仍
然不能改变此非常量对象的值;
3 在实际应用中,指向const的指针被用作函数的形式参数,它作为一个约定来保证,函数执行过程中
不会改变被传递给函数的实际对象的值。
4 int temp=90;
int * const ptemp=&temp;//ptemp是一个指向费常量对象的常量指针
*********************************************************************
*****************引用
1 引用主要被用作函数的形式参数---通常将一个类对象传递给函数
2 指针引用:
int * pi;
int * &ppi=pi;
3 只有const 引用可以用不同类型的对象初始化
double dval =9.899;
const int & ddval=dval;
******************字符串
错误!未到索引项。C++提供两种字符串表示:c风格字符串和C++string类;
字符串被保存在字符数组中,通常用一个char * 类型的指针来操控它;
标准c库为操作c风格字符串提供了一组函数:
int strlen(const char *);//返回长度
int strcmp(const char *,const char *);//比较是否相等
char * strcpy(cosnt char*,const char*);//把第二个字符串拷贝到第一个字符串中
char * strcat(str1,str2);//把2接到1后面
这些函数包括在:include <cstring>中
遍历c字符串通过接触指针引用,空字符为false,非空为true
while(*str++){}
1 字符串拷贝函数strcpy作用当我们使用一个指针时,在解除指针的引用之前,测试它是否指向某个对象是必要的:if(str){}
*******************内联函数
内联函数就是用本身的代码,替换函数的调用.
当代码复杂时,使用内联,会使程序目标代码体积过大,效率降低
当代码简单时,使用内联,会提高效率,比函数调用的效率要高.
inline只是对编译器的一个提示,编译器可以不理睬内联命令,编译器根据自身需要决定是否内联
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论