函数指针

C++的多态与切片问题(Section Problem)

回眸只為那壹抹淺笑 提交于 2019-11-26 17:38:53
C++内存分配的方式大体上可以归纳为3种 1) 从静态存储区中分配:内存在编译时就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量 2) 在栈上分配:执行函数时,函数内局部变量的存储单元都可在栈上创建,函数执行结束时,这些存储单元自动被释放 3) 在堆上分配:也称为动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,除非程序运行结束或者程序员自己用free或delete释放动态内存,否则这块动态内存一直存在 多态性是指为一个函数名关联多种含义的能力,即同一种调用方式可以映像到不同的函数。这种把函数的调用与适当的函数体对应的活动又称为绑定(binding)。根据绑定所进行阶段的不同,可分为早期绑定(early binding)、晚期绑定(late binding),早期绑定发生在程序的编译阶段,称为静态联编(static binding),晚期绑定发生在程序的运行阶段,称为动态联编(dynamic binding)。 1) 早期绑定(Early Binding):也称为编译期多态,指绑定是发生在编译阶段。 1 // : Poly.cpp 2 #include <iostream> 3 4 using namespace std; 5 6 class A { 7 public : 8 A() : x( 5 ) {} 9 virtual

c++知识点总结3

强颜欢笑 提交于 2019-11-26 17:30:27
http://akaedu.github.io/book/ week1 引用 :相当于变量的别名。下面r和n就相当于同一回事 int n=4; int &r=n; 引用做函数参数: void swap(int &a, int &b){ //a等价于n1, b等价于n2 int tmp; tmp=a; a=b; b=tmp; } int n1, n2; swap(n1, n2); const int &r=n; //不能通过常引用r来修改n的内容。 const const int MAXAL=23; const char* NAME="pentium"; int n; const int* p=&n; //不能通过常量指针p来修改n的内容int* q=p; //不能将常量指针赋给非常量指针,反之可以 void func(const char* p){ .... 不能提供常量指针p修改内容 } 动态内存分配 int *pn=new int; *pn=555; //动态分配出sizeof(int)这么大的内存,并将其起始地址返回给pn int *pm=new int[6]; pm[5]=666; //动态分配数组//new出来的对象必须手动delete。否则即使运行结束了系统也不会自行销毁 delete pn; delete[] pm; inline:内联函数

MFC文档、视图和框架

99封情书 提交于 2019-11-26 14:58:44
文档、视图、框架 文档/视图结构是MFC提供的一种不错的设计,它将数据的处理和显示分开来,这样更便于我们对程序的维护和扩展。 文档 文档对象用于管理和维护数据,包括保存数据、取出数据以及修改数据等操作,在数据被修改以后,文档可以通知其对应的所有视图更新显示。 文档类继承于CDocument类,主要成员函数: virtual BOOL OnNewDocument( ); 创建新文档。可以重载使用。 virtual BOOL OnOpenDocument(LPCTSTR lpszPathName); 打开文档。参数lpszPathName为要打开的文档的路径。可以重载使用。 virtual BOOL OnSaveDocument(LPCTSTR lpszPathName); 保存文档。参数lpszPathName指定文档保存到的全路径。可以重载使用。 CDocTemplate* GetDocTemplate( ) const; 获取此文档类型对应的文档模板对象的指针。如果此文档没有被文档模板管理则返回NULL。 virtual POSITION GetFirstViewPosition( ) const; 获取文档中视图列表的第一个视图的位置。 virtual CView* GetNextView(POSITION& rPosition) const;

C++:文件操作

断了今生、忘了曾经 提交于 2019-11-26 12:44:19
C/C++ code //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> void main() { ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1)return; //打开文件失败则结束运行 f1<<setw(20)<<"姓名:"<<"廉东方"<<endl; //使用插入运算符写文件内容 f1<<setw(20)<<"家庭地址:"<<"河南郑州"<<endl; f1.close(); //关闭文件 } 运行后打开文件d:\me.txt,其内容如下:        姓名:廉东方      家庭地址:河南郑州 文件操作: 打开文件   文件名     注意路径名中的斜杠要双写,如:     "D:\\MyFiles\\ReadMe.txt"   文件打开方式选项:     ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)     ios::out    = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)     ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in

GDB调试及coredump详解

情到浓时终转凉″ 提交于 2019-11-26 03:09:48
一、coredump:是针对程序异常而产生的core文件,包含程序运行时的内存、寄存器状态、堆栈指针、函数调用等信息,用于存储程序出错时的状态。 二、coredump的存储位置:与被执行文件在同一目录下。当然,位置可以在程序中通过 chdir 命令修改 三、如何判断是coredump文件:该文件主要的格式为 ELF 格式。可以通过 readelf -h core 进行判断,如图: 四、产生coredump的条件: 首先确认 当前会话 中的ulimit -c,若为0,则不会产生core,需要修改和设置。 附: ulimit -c unlimited #可以产生core且不受大小限制 ulimit -a #显示当前各种用户进程设置 #ulimit的某些参数设置与运行机器的配置有关,慎重使用。 ulimit -d unlimited #数据段长度 ulimit -m unlimited #最大内存大小 ulimit -s unlimited #堆栈大小 #以上是设置为无限制 #若是想设置对应字符大小,可以指定如下图: ulimit -c [size] 可能 -c 设置成 4 也不会生成core,因人而异。 当前用户对写入core目录的写权限有足够的空间。 其他不会产生core文件的原因。 五、coredump产生的几种情况 内存访问越界 多线程程序使用不安全的线程函数

gopl 底层编程(unsafe包)

筅森魡賤 提交于 2019-11-25 23:22:25
包 unsafe 广泛使用在和操作系统交互的低级包中, 例如 runtime、os、syscall、net 等,但是普通程序是不需要使用它的。 unsafe.Sizeof、Alignof 和 Offsetof 函数 unsafe.Sizeof 报告传递给它的参数在内存中占用的字节(Byte)长度(1Byte=8bit,1个字节是8位),参数可以是任意类型的表达式,但它不会对表达式进行求值。对 Sizeof 的调用会返回一个 uintptr 类型的常量表达式,所以返回的结果可以作为数组类型的长度大小,或者用作计算其他的常量: fmt.Println(unsafe.Sizeof(float64(0))) // "8" fmt.Println(unsafe.Sizeof(uint8(0))) // "1" 函数 Sizeof 仅报告每个数据结构固定部分的内存占用的字节长度。以字符串为例,报告的只是字符串对应的指针的字节长度,而不是字符串内容的长度: func main() { var x string x = "a" fmt.Println(unsafe.Sizeof(x), len(x)) // "16 1" var s []string for i := 0; i < 10000; i++ { s = append(s, "Hello") } x = strings.Join(s,

C++应用程序性能优化(三)——C++语言特性性能分析

半世苍凉 提交于 2019-11-25 21:08:27
C++应用程序性能优化(三)——C++语言特性性能分析 一、C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序。因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性。新的语言特性往往使得C++编译器在编译程序时插入了很多额外的代码,会导致最终生成的二进制代码体积膨胀,而且执行速度下降。 但事实并非如此,通常一个程序的速度在框架设计完成时大致已经确定,而并非因为采用C++语言才导致速度没有达到预期目标。因此,当一个程序的性能需要提高时,首先需要做的是用性能检测工具对其运行的时间分布进行一个准确的测量,找出关键路径和真正的性能瓶颈所在,然后针对性能瓶颈进行分析和优化,而不是主观地将性能问题归咎于程序所采用的语言。工程实践表明,如果框架设计不做修改,即使使用C语言或汇编语言重新改写,也并不能保证提高总体性能。 因此,遇到性能问题时,首先应检查和反思程序的总体架构,然后使用性能检测工具对其实际运行做准确的测量,再针对性能瓶颈进行分析和优化。 但C++语言中确实有一些操作、特性比其它因素更容易成为程序的性能瓶颈,常见因素如下: (1)缺页 缺页通常意味着要访问外部存储

数据结构(十四)——二叉树

久未见 提交于 2019-11-25 20:25:28
数据结构(十四)——二叉树 一、二叉树简介 1、二叉树简介 二叉树是由n(n>=0)个结点组成的有序集合,集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。 二叉树的五种形态: 2、二叉树的存储结构模型 树的另一种表示法:孩子兄弟表示法 A、每个结点都有一个指向其第一个孩子的指针 B、每个结点都有一个指向其第一个右兄弟的指针 孩子兄弟表示法的特性: A、能够表示任意的树形结构 B、每个结点包含一个数据成员和两个指针成员 C、孩子结点指针和兄弟结点指针构成树杈 3、满二叉树 如果二叉树中所有分支结点的度数都为2,并且叶子结点都在统一层次上,则二叉树为满二叉树。 4、完全二叉树 如果一棵具有n个结点的高度为k的二叉树,树的每个结点都与高度为k的满二叉树中编号为1——n的结点一一对应,则二叉树为完全二叉树。 完全二叉树的特性: A、同样结点数的二叉树,完全二叉树的高度最小 B、完全二叉树的叶子结点仅出现在最下边两层,并且最底层的叶子结点一定出现在左边,倒数第二层的叶子结点一定出现在右边。 C、完全二叉树中度为1的结点只有左孩子。 5、二叉树的特性 A、在二叉树的第i层上最多有2^(i-1)个结点(i>=1)。 B、高度为k的二叉树,最多有2^k-1个结点(k>=0)。 C、对任何一棵二叉树,如果其叶结点有n个,度为2的非叶子结点有m个,则 n = m