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.dllDllDemo.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小时内删除。