详解C++中的自动存储


-
C++有3种管理数据内存的方式即自动存储(栈存储)、静态存储和动态存储(堆存储)。在不同的方式下,内存的分配形式和存在时间的长短都不同。 下面对自动存储进行说明。 自动存储(栈存储) 对于函数的形参、内部声明的变量及结构变量等,编译器将在函数执行时为形参自动分配存储空间,在执行到变量和结构变量等的声明语句时为其自动分配存储空间,因此称其为自动变量(Automatic Variable),有的教科书也称其为局部变量,在函数执行完毕返回时,这些变量将被撤销,对应的内存空间将被释放。 事实上,自动变量的生存期只局限于它所在的代码块。所谓代码块,是包含在花括号对中的一段代码,函数只是代码块的一种,比

102KB
踏入C++中的雷区C++内存管理详解
2010-05-15内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
49.78MB
Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版
2012-09-11本书是讲解c++语言程序设计的优秀教程。全书围绕c++语言的结构来组织,开始章节介绍编程的普通概念,接下来详细介绍C++hh的继承、多态、异常处理以及标准模板库(STL),同时还包含模式和uML的介绍。本书内容系统、全面,给出了大量代码示例、自测练习、编程提示和编程练习,并且提供了练习的解答。本书有利于初学者尽快掌握c++的编程知识,养成良好的编程习惯;具备相当编程经验的人,也可以从本书了解到使用c++的更有效的方法。 译者序 前言 第1章 C++基础 1 1.1 C++简介 1 1.1.1 C++语言的起源 1 1.1.2 C++与面向对象的程序设计 1 1.1.3 C++的特点 2 1.1.4 C++术语 2 1.1.5 C++程序示例 2 1.2 变量、表达式及赋值语句 4 1.2.1 标识符 4 1.2.2 变量 5 1.2.3 赋值语句 6 1.2.4 更多赋值语句 8 1.2.5 赋值兼容性 9 1.2.6 字面常量 10 1.2.7 转义序列 11 1.2.8 命名常量 12 1.2.9 算术操作符和表达式 13 1.2.10 整数和浮点数除法 14 1.2.11 类型转换 15 1.2.12 自增和自减操作符 16 1.3 控制台输入/输出 19 1.3.1 使用cout输出 19 1.3.2 输出时换行 20 1.3.3 格式化带小数点的数字 21 1.3.4 用cerr输出 22 1.3.5 用cin输入 22 1.4 程序的风格 23 1.5 库与命名空间 24 1.5.1 库与include命令 24 1.5.2 命名空间 25 第2章 流程控制 30 2.1 布尔表达式 30 2.1.1 创建布尔表达式 30 2.1.2 布尔表达式求值 31 2.1.3 优先级原则 33 2.2 分支机制 37 2.2.1 if-else语句 37 2.2.2 复合语句 38 2.2.3 省略else 40 2.2.4 嵌套语句 40 2.2.5 多分支if-else语句 41 2.2.6 switch语句 42 2.2.7 枚举类型 44 2.2.8 条件操作符 44 2.3 循环 45 2.3.1 while和do-while语句 45 2.3.2 再谈增量、减量操作符 47 2.3.3 逗号操作符 49 2.3.4 for语句 50 2.3.5 break与continue语句 55 2.3.6 嵌套循环 57 第3章 函数基础 63 3.1 预定义函数 63 3.1.1 返回值的预定义函数 63 3.1.2 预定义的void函数 66 3.1.3 随机数生成器 68 3.2 程序员定义的函数 71 3.2.1 定义返回值的函数 71 3.2.2 函数声明的替代形式 73 3.2.3 调用函数的函数 73 3.2.4 返回布尔值的函数 75 3.2.5 定义void函数 76 3.2.6 void函数中的return语句 77 3.2.7 前提条件和执行结果 78 3.2.8 main函数 79 3.2.9 递归函数 79 3.3 作用域规则 80 3.3.1 局部变量 80 3.3.2 过程抽象 82 3.3.3 全局常量与全局变量 83 3.3.4 语句块 84 3.3.5 嵌套作用域 85 3.3.6 for循环中声明的变量 85 第4章 参数与重载 92 4.1 参数 92 4.1.1 传值调用参数 92 4.1.2 引用调用参数初步 94 4.1.3 引用调用机制详解 95 4.1.4 常量引用参数 97 4.1.5 混合参数列表 99 4.2 重载与默认实参 104 4.2.1 重载简介 104 4.2.2 分辨重载的准则 107 4.2.3 默认实参 109 4.3 测试及调试函数 111 4.3.1 assert宏 111 4.3.2 占位程序和驱动程序 112 第5章 数组 119 5.1 数组简介 119 5.1.1 数组的声明和引用 119 5.1.2 内存中的数组 122 5.1.3 数组的初始化 124 5.2 函数中的数组 125 5.2.1 作为函数实参的索引变量 125 5.2.2 整个数组作为函数实参 126 5.2.3 const参数修饰词 129 5.2.4 返回一个数组的函数 130 5.3 用数组编程 134 5.4 多维数组 141 5.4.1 多维数组基础 141 5.4.2 多维数组参数 142 第6章 结构和类 155 6.1 结构 155 6.1.1 结构类型 156 6.1.2 结构作为函数参数 159 6.1.3 结构的初始化 162 6.2 类 163 6.2.1 定义类和成员函数 163 6.2.2 封装 168 6.2.3 公有和私有成员 168 6.2.4 取值和赋值函数 171 6.2.5 结构和类 174 第7章 构造函数及其他工具 179 7.1 构造函数 179 7.1.1 构造函数的定义 179 7.1.2 构造函数的显式调用 183 7.1.3 类类型成员变量 190 7.2 其他工具 193 7.2.1 const参数修饰词 193 7.2.2 内联函数 198 7.2.3 静态成员 199 7.2.4 嵌套类和局部类定义 201 7.3 向量—标准模板库预览 202 7.3.1 向量基础 202 7.3.2 效率问题 205 第8章 操作符重载、友元和引用 210 8.1 基本操作符重载 210 8.1.1 重载基础 210 8.1.2 返回常量类型 215 8.1.3 重载一元操作符 218 8.1.4 作为成员函数的操作符重载 218 8.1.5 重载函数调用符 220 8.2 友元函数和自动类型转换 221 8.2.1 构造函数的自动类型转换 221 8.2.2 友元函数 222 8.2.3 友元类 225 8.3 引用和其他操作符重载 226 8.3.1 引用 226 8.3.2 重载“《”和“》” 228 8.3.3 赋值操作符 234 8.3.4 重载自增和自减操作符 235 8.3.5 重载数组操作符[] 237 8.3.6 基于左值和右值的重载 238 第9章 字符串 243 9.1 数组类型的字符串 243 9.1.1 C字符串值和C字符串变量 243 9.1.2 cstring 库中的其他函数 247 9.1.3 C字符串的输入和输出 250 9.2 字符操作工具 252 9.2.1 字符输入/输出 252 9.2.2 成员函数get和put 252 9.2.3 成员函数putback、peek和ignore 257 9.2.4 字符操作函数 258 9.3 标准string类 261 9.3.1 标准类string简介 261 9.3.2 string类的输入/输出 263 9.3.3 使用string类进行字符串处理 267 9.3.4 string类对象和C字符串的相互转换 273 第10章 指针和动态数组 280 10.1 指针 280 10.1.1 指针变量 280 10.1.2 内存管理基础 287 10.1.3 动态变量和自动变量 289 10.1.4 指针的应用 292 10.2 动态数组 292 10.2.1 数组变量和指针变量 292 10.2.2 创建和使用动态数组 294 10.2.3 指针运算 298 10.2.4 多维动态数组 299 10.3 类、指针和动态数组 300 10.3.1 ->操作符 301 10.3.2 this指针 301 10.3.3 重载赋值操作符 302 10.3.4 析构函数 309 10.3.5 复制构造函数 310 第11章 分散编译和命名空间 318 11.1 分散编译 318 11.1.1 封装回顾 318 11.1.2 头文件和实现文件 319 11.1.3 使用#ifndef 326 11.2 命名空间 329 11.2.1 命名空间和using命令 329 11.2.2 创建一个命名空间 330 11.2.3 using声明 333 11.2.4 限定名字 334 11.2.5 未命名的命名空间 337 11.2.6 嵌套命名空间 342 第12章 流和文件I/O操作 349 12.1 I/O流 349 12.1.1 文件I/O 350 12.1.2 向文件中添加内容 353 12.1.3 字符I/O 357 12.1.4 文件末尾检查 357 12.2 流I/O的工具 361 12.2.1 文件名作为输入 361 12.2.2 使用流函数对输出格式化 361 12.2.3 操作算子 364 12.2.4 保存设定的标记 365 12.2.5 其他的输出流成员函数 365 12.3 流的层次:继承的简要介绍 370 12.4 随机文件存取 375 第13章 递归 384 13.1 递归void函数 384 13.1.1 一个递归调用的跟踪 386 13.1.2 递归的进一步认识 388 13.1.3 递归调用的栈 391 13.1.4 递归与迭代的比较 392 13.2 有返回值的递归函数 393 13.3 按递归方式思考问题 397 13.3.1 递归设计技术 397 13.3.2 二分查找 398 13.3.3 编码 400 13.3.4 检查递归的正确性 402 13.3.5 效率 402 第14章 继承 410 14.1 继承基础 410 14.1.1 派生类 410 14.1.2 派生类的构造函数 417 14.1.3 protected限定词 420 14.1.4 成员函数的重定义 422 14.1.5 重定义与重载 423 14.1.6 访问重定义函数的基类版本 424 14.1.7 不可继承的函数 425 14.2 使用继承进行编程 426 14.2.1 派生类中的赋值操作符和复制 构造函数 426 14.2.2 派生类的析构函数 426 14.2.3 保护继承和私有继承 436 14.2.4 多继承 437 第15章 多态与虚函数 442 15.1 虚函数基础 442 15.1.1 后绑定 442 15.1.2 C++中的虚函数 443 15.1.3 抽象类和纯虚函数 448 15.2 指针和虚函数 451 15.2.1 虚函数和扩展类型兼容性 451 15.2.2 向下转换和向上转换 456 15.2.3 C++如何实现虚函数 457 第16章 模板 461 16.1 函数模板 461 16.2 类模板 471 16.2.1 类模板的语法 471 16.2.2 C++中的模板类vector和 basic_string 478 16.3 模板和继承 478 第17章 链式数据结构 487 17.1 节点和链表 487 17.1.1 节点 487 17.1.2 链表 491 17.1.3 向链表头插入一个节点 492 17.1.4 向链表中插入或移除节点 495 17.1.5 搜索链表 498 17.2 链表的应用 504 17.3 迭代器 514 17.3.1 指针作为迭代器 514 17.3.2 迭代器类 515 17.4 树 520 第18章 异常处理 535 18.1 异常处理基础 535 18.1.1 异常处理的一个样例 535 18.1.2 自定义异常类 542 18.1.3 多重抛出和捕获 543 18.1.4 在函数中抛出异常 546 18.1.5 异常说明 547 18.2 异常处理的编程技术 549 18.2.1 抛出异常的时机 549 18.2.2 异常类的层次结构 552 18.2.3 测试可用内存 552 18.2.4 再次抛出异常 552 第19章 标准模板库 555 19.1 迭代器 555 19.1.1 迭代器基础 556 19.1.2 迭代器的种类 559 19.1.3 常量迭代器和可变迭代器 562 19.1.4 反向迭代器 563 19.1.5 其他几种迭代器 565 19.2 容器 566 19.2.1 连续容器 566 19.2.2 容器适配器栈和队列 570 19.2.3 关联容器集合和映射 572 19.2.4 效率 575 19.3 泛型算法 576 19.3.1 运行时间和大O记法 576 19.3.2 容器访问运行时间 580 19.3.3 不改变序列的算法 580 19.3.4 改变序列的算法 583 19.3.5 集合算法 584 19.3.6 排序算法 585 第20章 模式和UML 592 20.1 模式 592 20.1.1 适配器模式 592 20.1.2 模型-视图-控制器模式 593 20.1.3 排序模式的效率 598 20.1.4 模式形式体系 599 20.2 UML 600 20.2.1 UML的历史 600 20.2.2 UML的类图表 600 20.2.3 类的相互作用 601 附录1 C++关键字 605 附录2 操作符优先级 606 附录3 ASCII字符集 608 附录4 一些库函数 609 附录5 旧的和新的头文件 614 参考资料 615
76.65MB
深入实践C++模板编程.温宇杰(带详细书签).pdf
2018-04-11C++模板编程领域的经典著作,由资深C++开发工程师撰写,以透彻分析原理为前提,深入讲解了模板编程的基本原理、标准库中算法与容器等模板的实现原理;本书以实践为导向,通过大量的模板向读者展示了如何使用模板进行编程以及如何编写自定义模板。除此之外,本书还总结了各种常用的模板编程技巧、C++11新标准中的模板新特性和新语法,以及C++11中新增的其他语言特性。 全书共16章,分为四部分:第一部分(1~4章)首先介绍了模板编程的基本概念与用法,然后重点讨论了编译器对模板的具体实现方法及其局限,读者可以通过本部分内容理解模板的基本原理并自行实现简单的类模板与函数模板;第二部分(第5~9章)对标准库中的算法与容器的实现原理和用法进行了深入地剖析,读者可以通过本部分内容对标准库中的算法、迭代器与容器之间的关系有深入的理解,从而可以精确调节标准容器的行为以及自行开发适用于标准算法的容器类模板;第三部分(10~13章)讨论了模板编程的高级技巧,如模板编程中“概念”的设计、控制代码量的技术、编译期逻辑的控制以及元编程的基本方法等,读者可以通过本部分内容开发更具规模、更加智能的模板库,并利用元编程技术实现编译期的逻辑演绎与类型推导;第四部分(14~16章)介绍了C++11新标准中的新增语言特性,以及对模板编程的影响。 封底: C++是一种强类型语言,同时支持面向对象的设计方法。在强类型要求下,如果机械地遵循“万物皆对象”的法则,同一种算法需要在不同的数据类型操作中重复实现,或者是设计一个抽象的类型专门容纳算法。无论哪一种方案,都有“削足适履”之嫌。C++中的模板很好地解决了这一问题!是否理解模板编程的原理以及是否掌握了模板编程的方法是普通C++程序员和高级C++程序员的分水岭。深入实践C++模板编程,不仅将进一步提升你的编程能力,而且会革新你的C++编程思想。 本书是近年来C++领域难得的作品,更是C++模板编程领域难得的佳作之一。它不仅深入剖析了模板编程的基本原理、标准库中算法与容器等模板的实现原理,而且还讲解了模板编程的高级技巧以及C++11新标准对模板的相应更新,更重要的是它从实践地角度讲解了如何进行模板编程和编写自定义的模板,为C++程序员进阶提供了很好的指导。 本书主要内容如下: (1)函数模板的原理、用法、模板参数自动推导,以及函数体的实现方法; (2)外名模板及其原理; (3)类模板及其用法,异质链表、元组构造方法,以及类模板的静态成员的处理; (4)各种整数型、指针型及引用型模板参数类型详解; (5)模板的特例,函数模板的重载,特例的写法及匹配规则; (6)标准库中的容器、迭代器和算法的定义、作用以及它们之间的关系; (7)标准库中的序列型容器、关联型容器、散列表容器、C++11新增的容器等各种类型的容器的实现原理; (8)各种分配器和迭代器的实现原理及其编写方法; (9)标准库中常用算法的原理分析及其应用实践; (10)各种常用的模板编程技巧,以及元编程技术; (11)C++11新标准的模板新特性和新语法,以及C++11新标准中新增的语言特性解读。 前: C++语言支持多种编程范式,其中,面向过程与面向对象最为人熟悉,相关书籍也不胜枚举,唯独模板编程少有书籍谈及,即使谈及,也多是泛泛介绍,一带而过。其实模板是C++中不容忽视的一个强有力的特性。模板将类型做为一种“变量”抽象出来,使得代码的适用范围进一步提高。又因为“类型”之抽象,更促使开发者在分析与解决问题时,不仅满足于个案分析,更要从不同类型的问题中提取出共性并加以实现。了解进而熟练使用模板的过程,是对开发者编程思路的又一次历练与升华。可惜专门介绍C++模板编程的图书十分稀少,使之成为一条少有人走的路。 而本书恰好弥补了这个空白。在本书中,您可以领略到模板的精密原理、容器与算法的渊源、泛型编程的奇思妙想,以及模板在C++11中的豹变。同时,这也是一本有趣的计算机图书,作者用生动的语言、精巧的构思以及详尽的示例,定会使读者在学习模板编程的过程中体会到发现新风景的愉悦。对于C++语言进阶读者,强烈推荐本书。 —— 广州三星通信研究院 首席研究员 软件研发总监 戴天荣 温宇杰 资深C++软件工程师,有多年C++开发经验,对C++模板编程和元编程有非常深入的研究,实践经验十分丰富。擅长组合优化算法及大规模集成电路辅助设计算法,对FPGA体系结构以及Verilog和VHDL等硬件描述语言也有非常深入的研究,曾主持并参与开发了一套完整设计流程的FPGA平台编译软件。 第一部分 模板基础 1 第1章 Hello模板 2 1.1 为什么需要模板 2 1.2 初识函数模板 3 1.2.1 函数模板的实现 3 1.2.2 如何使用函数模板 4 1.2.3 模板参数自动推导 5 1.2.4 模板参数默认值 7 1.2.5 模板函数的静态变量 8 1.3 如何处理函数模板中的函数体 8 1.3.1 HPP文件还是CPP文件 9 1.3.2 链接器如何识别重复模板实例 10 1.4 尴尬的Export Template 13 1.4.1 什么是外名模板 13 1.4.2 C++编译器对外名模板的处理 14 1.5 本章小结 15 第2章 类亦模板 16 2.1 类型无关的数据结构 16 2.2 实践——栈类模板 17 2.2.1 栈类模板实例 17 2.2.2 栈类模板衍生子类模板实例 20 2.3 突破——异质链表 21 2.4 构造元组 23 2.4.1 通过嵌套实现元组 23 2.4.2 用类实现元组 24 2.5 类模板的用法 25 2.5.1 成员函数模板 25 2.5.2 友元函数模板 26 2.6 类模板的静态成员 27 2.7 本章小结 30 第3章 模板参数类型详解 31 3.1 整数模板参数 31 3.2 函数指针模板参数 32 3.3 指针及引用模板参数 34 3.4 成员函数指针模板参数 35 3.5 模板型模板参数 37 3.6 本章小结 39 第4章 凡事总有“特例” 40 4.1 从vector说起 40 4.2 特例的多种写法 44 4.3 特例匹配规则 46 4.4 函数模板的特例与重载 47 4.4.1 分辨重载 50 4.4.2 编译期的条件判断逻辑 52 4.5 本章小结 54 第二部分 标准库中的模板 55 第5章 容器、迭代器与算法 56 5.1 容器的定义 56 5.2 容器的实现 56 5.2.1 Java的实现方法 57 5.2.2 C++的实现方法 60 5.3 容器与迭代器 62 5.3.1 链表容器与迭代器 64 5.3.2 集合容器与迭代器 67 5.4 迭代器与算法 71 5.4.1 求容器中元素之和 71 5.4.2 实例:微型算法库 73 5.5 容器与迭代器的分类 75 5.6 容器与算法的关系 76 5.7 迭代器的陷阱 76 5.8 本章小结 77 第6章 标准库中的容器 79 6.1 容器的分类及基本要求 79 6.2 序列型容器 81 6.2.1 变长数组vector 82 6.2.2 双向链表list 84 6.2.3 双端序列deque 85 6.3 容器转换器 87 6.3.1 栈stack与队列queue 87 6.3.2 优先队列priority_queue 88 6.4 关联型容器 89 6.4.1 基本数据结构 89 6.4.2 内嵌类型定义 92 6.4.3 构造关联型容器 92 6.4.4 插入数据 93 6.4.5 数据的删除、查找与访问 96 6.4.6 整数值专用集合bitset 98 6.5 散列表容器 99 6.5.1 基本数据结构 99 6.5.2 散列函数 100 6.5.3 桶 101 6.6 其他C++11新容器 104 6.6.1 定长数组array 104 6.6.2 单向链表forward_list 105 6.7 本章小结 106 第7章 隐形的助手——分配器 107 7.1 分配器的基本要求 107 7.2 交换容器内容时的特殊处理 110 7.3 有态分配器与无态分配器 112 7.4 实践:池分配器 114 7.4.1 池分配器模板类的设计 115 7.4.2 对象池的实现 116 7.4.3 定位构造 121 7.4.4 池分配器的实现 122 7.4.5 测试池分配器 127 7.4.6 实际运行 129 7.5 本章小结 131 第8章 标准库中的迭代器 132 8.1 迭代器分类 132 8.1.1 输入迭代器 132 8.1.2 前向迭代器 133 8.1.3 双向迭代器与跳转迭代器 135 8.1.4 输出迭代器 136 8.2 迭代器属性类模板 137 8.3 迭代器转换器 139 8.3.1 反转迭代器 139 8.3.2 插入迭代器 141 8.4 流迭代器 142 8.5 本章小结 144 第9章 标准库中的算法 145 9.1 算法的共同特征 145 9.2 标准库中的常用算法 145 9.2.1 foreach的三种写法 146 9.2.2 搜索 147 9.2.3 计数与比较 149 9.2.4 复制、交换、替换与删除 149 9.2.5 排序 151 9.2.6 二分搜索 151 9.2.7 集合运算 152 9.2.8 二叉堆操作 154 9.2.9 其他算法 154 9.3 预设函数对象 155 9.3.1 函数对象基类 155 9.3.2 运算函数对象 156 9.3.3 参数绑定 157 9.4 实践:矩阵操作中如何消除循环语句 165 9.4.1 跨跃迭代器 165 9.4.2 矩阵类模板 167 9.4.3 累计迭代器 169 9.4.4 矩阵乘法 170 9.4.5 矩阵LU分解 171 9.4.6 组合迭代器 172 9.4.7 没有循环语句的矩阵乘法 177 9.5 本章小结 178 第三部分 模板编程高级技巧 179 第10章 专用名词——概念 180 10.1 模板的先天不足 180 10.2 “概念”的提案及ConceptGCC编译器 181 10.3 概念语法 183 10.3.1 定义概念 183 10.3.2 用概念约束模板参数 184 10.3.3 概念映射 184 10.4 概念模拟库 186 10.4.1 概念检查宏 187 10.4.2 自定义概念检查 189 10.4.3 概念典型 190 10.5 本章小结 191 第11章 代码膨胀 192 11.1 源代码的增加 192 11.1.1 代理类的困境 192 11.1.2 D语言的方法 195 11.2 目标代码的增加 196 11.2.1 目标代码膨胀的成因 196 11.2.2 目标代码膨胀实例 197 11.2.3 改进代码 198 11.2.4 测试改进效果 206 11.3 本章小结 208 第12章 常用模板编程技巧 209 12.1 标签与特性 209 12.1.1 特性类模板numeric_limits 209 12.1.2 实例:矩阵与向量乘法 211 12.2 编译期多态 213 12.2.1 全覆盖的函数模板 213 12.2.2 虚函数的启发 213 12.2.3 虚基类模板 214 12.3 策略 217 12.3.1 策略的产生:再说vector的不足 217 12.3.2 为vector添加存储策略 218 12.4 伪变长参数模板 223 12.4.1 hetero_node的启发 224 12.4.2 编译期递归 225 12.4.3 访问元组中的数据 227 12.5 本章小结 230 第13章 元编程 231 13.1 C++中的元编程 231 13.2 元函数 231 13.2.1 元函数的实现 231 13.2.2 元函数的调用 233 13.3 元容器与元算法 235 13.3.1 元容器的实现 235 13.3.2 实例:容纳5种类型的元容器 236 13.4 类型过滤 240 13.4.1 类型过滤元函数的实现 240 13.4.2 实例:应用元容器与元算法 242 13.5 本章小结 244 第四部分 模板与C++11 245 第14章 右值引用 246 14.1 右值引用的产生 246 14.1.1 函数的匿名返回值 246 14.1.2 返回值优化 249 14.2 右值引用基本概念 251 14.2.1 左值与非左值 251 14.2.2 右值与右值引用 252 14.2.3 移动构造与移动赋值 252 14.2.4 狭义与广义的右值 253 14.2.5 左值强制转义成右值引用 254 14.2.6 右值引用变量是左值 255 14.3 引用声明符消去规则 256 14.3.1 完美转发 256 14.3.2 实例:智能的min函数 260 14.4 移动与异常 263 14.4.1 迁移数据的风险 263 14.4.2 关键字noexcept 265 14.4.3 转义函数模板 267 14.4.4 移动的效率问题 268 14.5 本章小结 269 第15章 模板新语法 270 15.1 变长参数模板 270 15.1.1 参数包 271 15.1.2 参数包的内容 272 15.1.3 参数包的展开模式 273 15.1.4 遍历参数包的内容 274 15.1.5 轻松实现元组 275 15.2 扩展的类型推导机制 276 15.2.1 自动类型变量 277 15.2.2 提取表达式结果类型 278 15.2.3 函数后置返回类型 280 15.3 其他模板新特性 281 15.3.1 外部模板实例 281 15.3.2 模板别名 282 15.3.3 连续的右尖括号 282 15.4 本章小结 283 第16章 C++11新特性集锦 284 16.1 λ表达式 284 16.1.1 λ表达式语法 284 16.1.2 变量捕获 285 16.2 初值列表新用法 290 16.2.1 构造变量 290 16.2.2 初值封装类模板 291 16.3 标准容器与算法的变化 292 16.3.1 对应右值引用 292 16.3.2 对应变长参数模板 293 16.3.3 对应初值列表 294 16.4 标准元组类模板 294 16.5 智能指针 296 16.5.1 独占指针unique_ptr 297 16.5.2 共享指针shared_ptr与weak_ptr 298 16.6 基于范围的for循环 299 16.7 拾遗 300 16.8 本章小结 301
103.11MB
C++ Qt设计模式(第2版)
2019-01-15C++ Qt设计模式(第2版)是美国萨福克大学已使用十余年的经典教程,利用跨平台开源软件开发框架Qt阐释了C++和设计模式中的主要思想。全书共分四个部分:第一部分介绍C++、UML、Qt、模型-视图、SQL、XML、设计模式等基础知识,目的是为零基础的C++初学者铺垫一条学习面向对象编程的快捷之路;第二部分讲解内存访问、继承等重要的C++特性,是前一部分的延伸和拓展;第三部分使用Phonon编写了一个多媒体播放器,展示了主要技术理念的应用方法;附录部分给出了C++保留关键字、Debian和Qt程序开发环境的配置等内容。每节的练习题和各章后面的复习题,既可作为课堂上的讨论题,也可进一步启发读者对于关键知识点的思考。 C++ Qt设计模式(第2版)目录 第一部分 设计模式与Qt 第1章 C++简介 2 第2章 类与对象 46 第3章 Qt简介 78 第4章 列表 85 第5章 函数 94 第6章 继承与多态 116 第7章 库与设计模式 163 第8章 QObject, QApplication,信号和槽 179 第9章 窗件和设计师 195 第10章 主窗口和动作 225 第11章 范型和容器 246 第12章 元对象,属性和反射编程 262 第13章 模型和视图 277 第14章 验证和正则表达式 302 第15章 XML解析 318 第16章 更多的设计模式 335 第17章 并发 353 第18章 数据库编程 376 第二部分 C++语言规范 第19章 类型与表达式 386 第20章 作用域与存储类 416 第21章 内存访问 431 第22章 继承详解 443 第三部分 编 程 作 业 第23章 MP3自动点唱机作业 456
65KB
C++中静态存储区与栈以及堆的区别详解
2020-12-31学习c++如果不了解内存分配是一件非常可悲的事情。而且,可以这样讲,一个C++程序员无法掌握内存、无法了解内存,是不能够成为一个合格的C++程序员的。一、内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。堆区:亦称动态内存分配。程序在运行的时候用
140KB
C/C++ 中堆和栈及静态数据区详解
2021-01-21C/C++ 中堆和栈及静态数据区详解 五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 全
75.74MB
Visual C++数据采集与串口通信测控应用实战.田敏(带详细书签) PDF 下载 高清 完整版
2018-01-24本书从工程应用的角度出发,对Visual C++(简称VC++)开发测控程序的各种方法进行了全面阐述。内容包括在VC++工程中调用ActiveX控件和DLL动态链接库等开发板卡数据采集与控制程序,以及在VC++工程中利用MSComm控件调用API函数等方法开发串口通信程序。每种程序设计方法都提供了多个设计操作,每个设计都提供了线路图、详细的任务实现方法和完整的程序代码,所有代码均编译通过,并经过实际测试。 书中提供的典型测控应用实例都有详细的操作步骤,读者可以按步骤去实现VC++的各种测控功能。实践操作性强是本书的特色。 本书内容丰富,论述深入浅出,有较强的实用性和可操作性,可供高等院校自动化、计算机应用、电子信息、机电一体化及测控仪器等专业学生以及从事计算机测控系统研发的工程技术人员学习和参考。 第1章 计算机测控系统概述 1.1 计算机测控系统的含义与工作原理 1.1.1 计算机测控系统的含义 1.1.2 计算机测控系统的工作原理 1.2 计算机测控系统的任务和特点 1.2.1 计算机测控系统的任务 1.2.2 计算机测控系统的特点 1.3 计算机测控系统的组成 1.3.1 硬件组成 1.3.2 软件组成 1.4 计算机测控系统的分类 1.4.1 按功能分类 1.4.2 按设备形式分类 1.5 计算机测控系统应用软件的开发工具 1.5.1 面向机器的语言 1.5.2 高级语言 1.5.3 组态软件 第2章 Visual C++程序设计基础 2.1 Visual C++工程开发步骤 2.1.1 建立新工程项目 2.1.2 设计程序界面 2.1.3 添加成员变量 2.1.4 添加自定义成员函数 2.1.5 添加消息函数 2.1.6 添加程序其他代码 2.1.7 保存应用程序 2.1.8 编译运行应用程序 2.2 Visual C++的内部控件 2.2.1 静态控件CStatic 2.2.2 编辑框控件CEdit 2.2.3 按钮控件Cbutton 2.2.4 列表框控件CListBox 2.2.5 组合框控件CComboBox 2.2.6 滚动条控件CscrollBar 2.2.7 滑块控件CSlideCtrl 2.2.8 进度条控件CProgressCtrl 2.2.9 标签控件CTabCtrl 2.2.10 列表视图控件CListCtrl 2.3 ActiveX控件 2.3.1 ActiveX控件的添加 2.3.2 常用的ActiveX控件 2.4 控制语句 2.4.1 顺序语句 2.4.2 选择语句 2.4.3 循环语句 2.4.4 其他控制语句 第3章 基于板卡的数据采集与控制系统 3.1 数据采集与控制系统的组成 3.1.1 硬件子系统 3.1.2 软件子系统 3.1.3 系统特点 3.2 数据采集卡概述 3.2.1 数据采集卡的产生 3.2.2 数据采集卡的输入与输出信号 3.2.3 数据采集卡的类型 3.2.4 数据采集卡的性能指标 3.3 PCI-1710HG多功能板卡的安装 3.3.1 PCI-1710HG多功能板卡介绍 3.3.2 用PCI-1710HG多功能板卡组成的测控系统 3.3.3 PCI-1710HG板卡设备的安装 3.3.4 PCI-1710HG板卡设备的测试 3.4 Visual C++与数据采集 3.4.1 概述 3.4.2 ActiveDAQ控件的安装 3.4.3 ActiveDAQ控件说明 3.5 数据采集卡的编程方式 3.5.1 软件触发方式 3.5.2 中断传输方式 3.5.3 DMA数据传输方式 3.6 在Visual C++环境下建立ActiveDAQ应用工程 第4章 数据采集与控制程序设计典型实例 4.1 基于板卡的模拟量输入程序设计 4.1.1 基于板卡的模拟量输入程序设计目的 4.1.2 基于板卡的模拟量输入程序设计用软、硬件 4.1.3 基于板卡的模拟量输入程序硬件线路 4.1.4 设计任务 4.1.5 任务实现 4.2 基于板卡的模拟量输出程序设计 4.2.1 基于板卡的模拟量输出程序设计目的 4.2.2 基于板卡的模拟量输出程序设计用软、硬件 4.2.3 基于板卡的模拟量输出程序硬件线路 4.2.4 设计任务 4.2.5 任务实现 4.3 基于板卡的开关量输入程序设计 4.3.1 基于板卡的开关量输入程序设计目的 4.3.2 基于板卡的开关量输入程序设计用软、硬件 4
65KB
C++11中std::packaged_task的使用详解
2021-01-20C++11中的std::packaged_task是个模板类。std::packaged_task包装任何可调用目标(函数、lambda表达式、bind表达式、函数对象)以便它可以被异步调用。它的返回值或抛出的异常被存储于能通过std::future对象访问的共享状态中。 std::packaged_task类似于std::function,但是会自动将其结果传递给std::future对象。 std::packaged_task对象内部包含两个元素:(1).存储的任务(stored task)是一些可调用的对象(例如函数指针、成员或函数对象的指针)( A stored task, which
77KB
C++中赋值运算符与逗号运算符的用法详解
2021-01-01赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。 赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时会自动进行类型转换。 1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。 2) 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。 3) 将一个double型数据赋给float变量时,要注意数值范围不能溢出。 4) 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。 5) 将一个
13.26MB
c++学习经典图书:C++ 编程思想(全).rar
2011-05-04本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器类、多重继承、异常处理和运行时类型识别。 本书作为正式教材和自学用书均非常优秀,作为程序设计者的参考用书亦极为合适。 目 录 译者序 前言 第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐进的学习方式 4 1.2.3 运行效率 4 1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺什么 10 1.3.6 方法应当提供什么 10 1.4 起草:最小的方法 12 1.4.1 前提 13 1.4.2 高概念 14 1.4.3 论述(treatment) 14 1.4.4 结构化 14 1.4.5 开发 16 1.4.6 重写 17 1.4.7 逻辑 17 1.5 其他方法 17 1.5.1 Booch 18 1.5.2 责任驱动的设计(RDD) 19 1.5.3 对象建模技术(OMT) 19 1.6 为向OOP转变而采取的策略 19 1.6.1 逐步进入OOP 19 1.6.2 管理障碍 20 1.7 小结 21 第2章 数据抽象 22 2.1 声明与定义 22 2.2 一个袖珍C库 23 2.3 放在一起:项目创建工具 29 2.4 什么是非正常 29 2.5 基本对象 30 2.6 什么是对象 34 2.7 抽象数据类型 35 2.8 对象细节 35 2.9 头文件形式 36 2.10 嵌套结构 37 2.11 小结 41 2.12 练习 41 第3章 隐藏实现 42 3.1 设置限制 42 3.2 C++的存取控制 42 3.3 友元 44 3.3.1 嵌套友元 45 3.3.2 它是纯的吗 48 3.4 对象布局 48 3.5 类 48 3.5.1 用存取控制来修改stash 50 3.5.2 用存取控制来修改stack 51 3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 4.3.1 for循环 59 4.3.2 空间分配 60 4.4 含有构造函数和析构函数的stash 61 4.5 含有构造函数和析构函数的stack 63 4.6 集合初始化 65 4.7 缺省构造函数 67 4.8 小结 68 4.9 练习 68 第5章 函数重载与缺省参数 69 5.1 范围分解 69 5.1.1 用返回值重载 70 5.1.2 安全类型连接 70 5.2 重载的例子 71 5.3 缺省参数 74 5.4 小结 81 5.5 练习 82 第6章 输入输出流介绍 83 6.1 为什么要用输入输出流 83 6.2 解决输入输出流问题 86 6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 6.9 建立操纵算子 108 6.10 输入输出流实例 111 6.10.1 代码生成 111 6.10.2 一个简单的数据记录 117 6.11 小结 123 6.12 练习 123 第7章 常量 124 7.1 值替代 124 7.1.1 头文件里的const 124 7.1.2 const的安全性 125 7.1.3 集合 126 7.1.4 与C语言的区别 126 7.2 指针 127 7.2.1 指向const的指针 127 7.2.2 const指针 127 7.2.3 赋值和类型检查 128 7.3 函数参数和返回值 128 7.3.1 传递const值 128 7.3.2 返回const值 129 7.3.3 传递和返回地址 131 7.4 类 133 7.4.1 类里的const和enum 133 7.4.2 编译期间类里的常量 134 7.4.3 const对象和成员函数 136 7.4.4 只读存储能力 139 7.5 可变的(volatile) 140 7.6 小结 141 7.7 练习 141 第8章 内联函数 142 8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱 152 8.5 预处理器的特点 153 8.6 改进的错误检查 154 8.7 小结 155 8.8 练习 155 第9章 命名控制 157 9.1 来自C语言中的静态成员 157 9.1.1 函数内部的静态变量 157 9.1.2 控制连接 160 9.1.3 其他的存储类型指定符 161 9.2 名字空间 161 9.2.1 产生一个名字空间 162 9.2.2 使用名字空间 163 9.3 C++中的静态成员 166 9.3.1 定义静态数据成员的存储 166 9.3.2 嵌套类和局部类 168 9.3.3 静态成员函数 169 9.4 静态初始化的依赖因素 171 9.5 转换连接指定 174 9.6 小结 174 9.7 练习 174 第10章 引用和拷贝构造函数 176 10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的选择 188 10.4 指向成员的指针
123KB
AutoCad DXF 中文开发文档详解
2015-05-07在DXF文件中,我们最关心的是如何得到模型上各个点的坐标,并且用这些点连成许多个三用形,构成面,进而绘制出整个模型。在DXF文件的结构中,我们已经看到,DXF文件先叙述实体上各个点的坐标,然后叙述实体上有多少个面,每个面由哪些点构成。这样,我们至少需要2个数组来存储一个实体的信息,一个用于存储点的坐标,一个用于存储点序,我们可以把这2个数组放到一个结构中,如果模型中实体的数目不止一个是,我们就用这个结构来定义一个数组。在本文中,我们使用 Visual C++ 6.0 来写一个读取DXF文件的小程序。 在实际应用中,模型中实体的数目以及实体中点和面的数目都是不定的,为了有效地利用内存,我们选择MFC类库中的聚合类CobArray类所创建的对象vertex, sequence来存储和管理实体的点坐标和点序。 CObArray类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作更加方便、快捷,用它编的程序也易于读懂。 三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为$UCSORG的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三维坐标。通过读取$EXTMAX,$EXTMIN可以获知三维实体在世界坐标系中的范围,而其它部分的信息只有读完了全部DXF文件后才可以通过计算确定。对于三维实体模型的全部点坐标、点序,可以在实体段中按照前面介绍的DXF文件基本结构读出。现
87KB
C++学习代码(实例)
2012-06-03++内存管理详解 伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 1、内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
7KB
堆内存和栈内存详解 ESP
2011-06-01一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。
16KB
java堆栈的区别 -- 详解
2009-12-24堆和栈是两个不同的概念 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 } 二、堆和栈的理论知识 2.1申请方式 stack: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 heap: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 在C++中用new运算符 如p2 = (char *)malloc(10); 但是注意p1、p2本身是在栈中的。 2.2 申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 2.3申请大小的限制 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 2.4申请效率的比较: 栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活 2.5堆和栈中的存储内容 栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 2.6存取效率的比较 char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb"; aaaaaaaaaaa是在运行时刻赋值的; 而bbbbbbbbbbb是在编译时就确定的; 但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 比如: #include void main() { char a = 1; char c[] = "1234567890"; char *p ="1234567890"; a = c[1]; a = p[1]; return; } 对应的汇编代码 10: a = c[1]; 00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1]; 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx+1] 00401073 88 45 FC mov byte ptr [ebp-4],al 第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。 ? 2.7小结: 堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 堆和栈的区别主要分: 操作系统方面的堆和栈,如上面说的那些,不多说了。 还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。 虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。
19.31MB
visual C++_Turbo C串口通信编程实践
2010-07-30里面讲了MSComm控件 、 WinAPI 串口通信、CSerial类,例子很详实,每一步操作都有解释。作者是龚建伟,有一个个人主页www.gjwtech.com,讲串口通信的内容比较多,还行,大家可以先看看这个主页。 本书目录 第1章轻松体验串口通信编程与调试 1.1初识串口 1.1.1从外观上了解串口 1.1.2 串口通信的发展前景 1.2 自己制作简单的串口线 1.2.1 三线制串口接线的规定 1.2.2 焊接制作自己的串口连接线 1.3 调试串口通信程序时的几种使用串口的技巧 1.3.1 查看计算机串口资源 1.3.2 常规调试-2个物理串口之间的通信 1.3.3 特殊调试-单个物理串口之间的通信 1.3.4 虚拟串口-为计算机添加取之不尽的串口资源 1.4 使用串口调试助手来体验串口通信 1.5体验Windows环境下Visual C++串口通信编程 1.6体验DOS环境下Turbo C串口通信编程 第2章 VC多线程串口编程工具CSerialPort类 2.1 类功能及成员函数介绍 2.2 应用CSerialPort类编制基于对话框的应用程序 2.3 应用CSerialPort类编制基于单文档的应用程序 2.4对CSerialPort类的改进 2.5 在Visual C++.NET中应用CSerialPort类 第3章 控件MSComm串口编程 3.1 MSComm控件详细介绍 3.1.1 VC中应用MSComm控件编程步骤 3.1.2 MSComm控件串行通信处理方式 3.1.3 MSComm 控件的属性说明 3.1.4 MSComm控件错误信息 3.2使用MSComm控件的几个疑难问题 3.2.1使用VARIANT 和SAFEARRAY 数据类型从串口读写数据 3.2.2 MSComm控件能离开对话框独立存在吗? 3.2.3 如何发送接收ASCII值为0和大于128的字符? 3.2.4 在同一程序中用MSComm控件控制多个串口的具体操作方法 3.2.5解决使用控件编程时程序占用的内存会不断增大的问题 3.2.6在没有安装Visual Studio的计算机上如何使用MSComm控件 3.2.7 在MSComm控件串口编程时遇到的其它问题说明 3.3在基于单文档(SDI)程序中应用MSComm控件 3.4应用MSComm控件控制多个串口实例 第4章 Windows API串口编程 4.1 Windows API串口编程概述 4.2 API串口编程中用到的结构及相关概念说明 4.2.1 DCB(Device Control Block)结构 4.2.2超时设置COMMTIMEOUTS结构 4.2.3 OVERLAPPED异步I/O重叠结构 4.2.4 通信错误与通信设备状态 4.2.5 串行通信事件 4.3 Windows API串行通信函数 4.4 Win32 API串口通信编程的一般流程和特殊实例 4.4.1 Win32 API串口通信编程的一般流程 4.4.2 用查询方式读串口 4.4.3同步I/O读写数据 4.4.4 关于流控制的设置问题 4.5 CSerialPort类中的API函数编程应用剖析 4.6 Win32 API串口编程TTY(虚拟终端)实例 4.7 Windows API串口精简例程 第5章 串口调试助手V2.2详细编程 5.1 建立SCOMM程序工程实现界面功能 5.2 串口的初始化及关闭 5.3串口数据的发送与接收及十六进制数据的处理 5.3.1 十六进数据发送处理 5.3.2 手动发送处理 5.3.3自动发送处理 5.3.4 接收处理及十六进制显示 5.4 其它辅助功能的实现 5.4.1 接收数据的文件保存 5.4.2 实现小文件发送 5.4.3 图钉按钮功能使程序能浮在最上层 5.4.4 对话框动画图标的实现 5.4.5 超链接功能的实现 5.4.6 如何打开帮助网页文件 第6章 DOS环境下的Turbo C串口编程及通用实例GSerial类 6.1 PC机异步通信适配器8250及其编程操作 6.1.1 INS8250内部寄存器及其选择方式 6.1.2 波特率设置 6.1.3数据位、奇偶校验、停止位等数据格式设置 6.1.4 查询I/O方式相关设置 6.1.5 中断I/O通信方式相关设置 6.1.6 Modem寄存器 6.2 COMRXTX程序实例 6.3 通用实例程序GSerial类 6.4 用GSerial类控制多串口 6.5 多串口编程PC机高号中断8259A可编程中断控制器的控制 第7章 数据处理方法与串口通信用户层协议的编制 7.1 通信协议的编制 7.1.1 为什么要编制用户通信协议? 7.1.2 串口通信中用户层协议编制原则 7.1.3 在串口通信中几种常用的用户层协议说明 7.2 数制、数据的表示及逻辑运算 7.2.1串口通信编程常用的数制 7.2.2 ASCII文本及其表示方法 7.2.3 逻辑运算与位运算 7.3 数据包校验与常用校验算法 7.3.1 数据校验过程 7.3.2奇偶校验 7.3.3 异或校验 7.3.4 CRC循环冗余码校验 7.4 串口通信数据包处理方法编程实例第8章 单片机串口通信 第8章 单片机串口通信 8.1 单片机串口硬件系统及C51程序开发 8.1.1较典型的单片机硬件系统实例 8.1.2 C51语言及程序简介 8.1.3 开发C51程序的利器Keil C51 uVISION2及串口程序仿真 8.2 C51单片机串口通信程序实例 8.3 AVR单片机串口通信 8.3.1 AVR 单片机简介 8.3.2 CodeVisionAVR编译环境及程序下载 8.3.3 AVR单片机串口通信 8.4 Freescal(Motorola)单片机开发及串口通信实例 8.4.1 Freescal(Motorola)单片机软件集成开发环境和程序下载 8.4.2 Freescal(Motorola) 8位单片机程序烧写专用软件:PROG08SZ-FLASH PROGRAMMER 8.4.3 Freescal(Motorola)单片机串口通信程序实例 第9章 串口与网络结合的解决方案及编程 9.1串口与网络结合的硬件解决方案 9.2典型串口与网络联接的设备介绍 9.2.1 NPort5400系列产品特点说明 9.2.2 NPort5400系列产品的典型应用介绍 9.2.3 NPort5400系列产品的设置与编程测试 9.3与ACCESS数据库结合的串口通信实例 9.3.1电子罗盘数据处理 9.3.2创建ODBC数据源 9.3.3创建工程 9.3.4编写程序 9.4与WinSock结合的串口通信实例 9.4.1 客户端Client应用程序 9.4.2 服务器Server应用程序 9.5 在已经编好的串口通信程序中加入网络通信功能 9.5.1参照MFC AppWizard创建WinSockets程序 9.5.2 利用Windows Sockets API和第三方提供的类进行编程 9.6串口通信用于遥控操作简例 第10章 计算机串口与其它通信协议设备的联接 10.1 串口与其它通信协议模块的调试与设备 10.1.1 Windows超级终端 10.1.2串口通信中的无线数据传输 10.2 计算机与Rabbit 2000嵌入式系统通信编程实例 10.2.1 Rabbit2000微处理器介绍 10.2.2 动态C(Dynamic C)语言介绍 10.2.3某车载无线调度系统实例介绍 10.3 计算机与PLC通信程序实例 10.4 MATLAB环境串口编程通信实例 10.4.1 MATLAB串口类Serial应用 10.4.2通过串口使MATLAB simulink与下位机通讯进行控制 10.4.3 xPC目标环境下串口通信实现 第11章 串口通信基本概念及标准 11.1 串口通信基本概念 11.1.1 串行通信概述 11.1.2 单工、半双工和全双工的定义 11.1.3 同步传送与异步传送 11.1.4串行通信协议 11.2 RS-232-C串口标准 11.2.1 RS-232-C标准 11.2.2 RS-232-C串行通信接线实例 11.3 RS-422/485串口标准 11.3.1 RS-422/485串口通信特点 11.3.2 RS-422与RS-485串行接口标准 11.3.3 RS-422与RS-485的网络安装注意要点 11.3.4 RS-232、RS422、RS485电气参数对比 11.4 串口调试注意事项 11.5 常用数据校验法 11.5.1奇偶校验 11.5.2 循环冗余码校验 11.6 串口连接和TCP/IP连接对比 11.7 现场总线与RS232、RS485的本质区别 11.8 Modem通信技术 11.8.1 Modem的基本工作原理 11.8.2 Modem的功能 11.8.3 Modem的分类 11.8.4 Modem的安装 11.8.5 Modem V.92标准介绍 11.8.6 Modem的速度 11.8.7 modem优化方法 11.8.8 Modem命令/AT命令 第12章 不占用串口的串口数据捕捉 12.1驱动程序的基本概念:VxD与WDM 12.2 VxD示例程序介绍-VToolsD中的CommHook 12.3 串口数据捕捉实例程序 12.4 虚拟串口简介 第13章 串口通信综合应用实例 13.1七自由度机械臂远程控制系统 13.1.1 基于串口通信的单片机系统设计 13.1.2 基于串口与TCP/IP网络的远程控制 13.1.3基于视频网络服务器的远程控制 13.2 基于串口通信的LMS-200激光雷达数据处理 13.2.1 LMS-200激光雷达工作原理 13.2.2激光雷达数据处理软件的开发 13.2.3 软件开发详细步骤 13.2.4 实验测试 13.3 串口通信在PC/104系统中的应用 13.3.1 PC/104简介 13.3.2 基于PC/104的机器人控制系统 13.3.4 下位机程序 13.4 串口在先锋机器人P3-AT中的应用 13.4.1 P3-AT简介 13.4.2 串口通信协议 13.4.3 发送控制代码的简单示例程序 13.4.4 ARIA中串口类的使用
227.79MB
微软技术丛书: Windows核心编程 第5版 [美] Jeffrey Richter 等 著 - 周靖 等 译(2008.9出版, PDF格式, 附源码)
2019-07-22内容简介 · · · · · · 这是一本经典的Windows核心编程指南,从第1版到第5版,引领着数十万程序员走入Windows开发阵营,培养了大批精英。 作为Windows开发人员的必备参考,本书是为打算理解Windows的C和C++程序员精心设计的。第5版全面覆盖Windows XP,Windows Vista和Windows Server 2008中的170个新增函数和Windows特性。书中还讲解了Windows系统如何使用这些特性,我们开发的应用程序又如何充分使用这些特性,如何自行创建新的特性。... 作者简介 · · · · · · Jeffrey Richter是一位在全球享有盛誉的技术作家,尤其在Windows/.NET领域有着杰出的贡献。他的第一本Windows著作Windows 3: A Developer's Guide大获好评,从而声名远扬。之后,他又推出了经典著作《Windows 高级编程指南》和《Windows核心编程》。如今这两本书早已成为Windows程序设计领域的颠峰之作,培育了几代软件开发设计人员。他的每一本新作问世,我们都有理由相信这是一本巨著,我们想要的一切尽在其中。Jeffery 是Wintellect公司的创始人之一,也是MSDN杂志.NET专栏的特邀编辑。现在他正领导开发该公司的.NET程序设计课程,向大众推广.NET技术。因为他自1999年开始就参与了微软.NET框架开发组的咨询工作,与这些一线人员一起经历了.NET的孕育与诞生,所以他对.NET思想的领悟、对.NET的细节熟稔,是其他任何作家难以企及的。他是.NET著作领域中当之无愧的一面旗帜。 Christophe Nasarre是Business Objects的软件架构师和开发部门领导,该公司致力于帮助其他企业更好地专注于其主营业务,通过商业智能方案来提升决策能力和业绩。他为Addison-Wesley,APress和Microsoft Press出版的许多图书担任过技术审校,此外还是MSDN Magazine的撰稿人。 目录 · · · · · · 第1部分 必备知识 第1章 错误处理 1.1 定义自己的错误代码 1.2 ErrorShow示例程序 第2章 字符和字符串处理 2.1 字符编码 2.2 ANSI字符和Unicode字符与字符串数据类型 2.3 Windows中的Unicode函数和ANSI函数 2.4 C运行库中的Unicode函数和ANSI函数 2.5 C运行库中的安全字符串函数 2.5.1 初识新的安全字符串函数 2.5.2 在处理字符串时如何获得更多控制 2.5.3 Windows字符串函数 2.6 为何要用Unicode 2.7 推荐的字符和字符串处理方式 2.8 Unicode与ANSI字符串转换 2.8.1 导出ANSI和Unicode DLL函数 2.8.2 判断文本是ANSI还是Unicode 第3章 内核对象 3.1 何为内核对象 3.1.1 使用计数 3.1.2 内核对象的安全性 3.2 进程内核对象句柄表 3.2.1 创建一个内核对象 3.2.2 关闭内核对象 3.3 跨进程边界共享内核对象 3.3.1 使用对象句柄继承 3.3.2 改变句柄的标志 3.3.3 为对象命名 3.3.4 终端服务命名空间 3.3.5 专有命名空间 3.3.5 复制对象句柄 第Ⅱ部分 工作机制 第4章 进程 4.1 编写第一个Windows应用程序 4.1.1 进程实例句柄 4.1.2 进程前一个实例的句柄 4.1.3 进程的命令行 4.1.4 进程的环境变量 4.1.5 进程的关联性 4.1.6 进程的错误模式 4.1.7 进程当前所在的驱动器和目录 4.1.8 进程的当前目录 4.1.9 系统版本 4.2 CreateProcess函数 4.2.1 pszApplicationName和pszCommandLine参数 4.2.2 psaProcess,psaThread和bInheritHandles参数 4.2.3 fdwCreate参数 4.2.4 pvEnvironment参数 4.2.5 pszCurDir参数 4.2.6 psiStartInfo参数 4.2.7 ppiProcInfo参数 4.3 终止进程 4.3.1 主线程的入口点函数返回 4.3.2 ExitProcess函数 4.3.3 TerminateProcess函数 4.3.4 当进程中的所有线程终止时 4.3.5 当进程终止运行时 4.4 子进程 4.5 管理员以标准用户权限运行时 4.5.1 自动提升进程的权限 4.5.2 手动提升进程的权限 4.5.3 何为当前权限上下文 4.5.4 枚举系统中正在运行的
741KB
VC++常用的共用函数100多页
2009-05-21相关网站 7 设置窗口最大最小 7 设置窗口标题 7 去掉主菜单 7 修改应用程序图标 7 系统只能允许一个程序运行 7 在状态栏中添加时间 8 研究调用存储过程 8 得到本机的IP地址 9 vc调用chm文件 10 最高窗口的实现 10 防止Edit框中的Password不保密 11 在同一系统中显示GB字符和BIG5字符 12 改变颜色(整个窗体的控件) 13 改变工程表头栏 13 ◆如何找开一个DiaLog的窗口◆ 13 ◆得到系统中设置的窗口颜色◆ 14 ◆如何让点下去的菜单成为V状态◆ 14 ◆如何调用WINDOWS的颜色板◆ 14 ◆如何产生一个MDI的主窗口◆ 15 ◆如何让一个文本控件显示出值◆ 15 ◆如何让一个控件显示出相应的值◆ 16 ◆在调试中怎么样MESSAGEBOX一个数字◆ 16 ◆如何控制控件的焦点◆ 16 ◆如何对析构函数中对象进行释放◆ 16 ◆如何关闭一个模态窗口◆ 17 ◆如何将一个提示的声音发到声卡上◆ 17 ◆如何得到打开exe的带的参数◆ 17 ◆如何在框架上建立一个工具条◆ 17 ◆如何生成一个主窗口下方的状态条◆ 18 ◆如何让Cscrollview类中控制其可以流动区域大小◆ 19 ◆MFC中控件的一些基本控制方法◆ 19 ◆如何让一个数字型变量化为字符型变量◆ 19 ◆如何使用“拉动条”,“上下选择”◆ 19 ◆如何使用postmessage来异步触发某事件◆ 21 ◆如何使用Sendmessage来异步触发某事件◆ 22 ◆如何修改父类的相关控件属性◆ 22 ◆如何在程序中得到控件的名◆ 22 ◆如何控制菜单的事件程序◆ 22 ◆如何使用控件中的数据录入的控制属性◆ 23 ◆哪些函数是文档、视图相互处理用的◆ 23 ◆如何建立一个基于对话框一程序◆ 23 ◆如何建立一个线程◆ 24 ◆如何让窗口产生一个图标(从应用程序资源中取出)◆ 24 ◆如何得到一个edit的录入的值◆ 24 ◆如何启动TIMER事件◆ 25 ◆如何使用ctrllist控件实现表格◆ 25 ◆如何从INI文件中得到值◆ 25 ◆如何将图标文件写到窗口中◆ 26 ◆如何得到本机的IP地址◆ 26 ◆如何使用全局变量◆ 26 ◆如何让一个字符加上回车、换行◆ 26 ◆如何定义、使用结构◆ 26 ◆如何在任意程序中显示MessageBox◆ 27 ◆如何在程序判断出debug状态◆ 27 ◆当对话框中有一个滚动条是,当滚动滚动条时的消息控制函数◆ 27 ◆将一个CWnd指针转换成一个控件ID(整数)注意用GetDlgItem()函数是从一个控件ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给执行文件加一个图标◆ 30 ◆如何在全局函数中通过传入的窗口句柄操作窗口◆ 30 ◆如何使桌面文字背景透明?◆ 30 ◆怎样才能在VC里产生一个唯一的字符串◆ 31 ◆如何隐藏进程(在系统状态栏和进程列表里不可见)◆ 31 ◆如何得到一个确定大小的视?◆ 31 ◆如何实现点击窗口任意地方拖动窗口?◆ 32 ◆如何在启动时阻止MDI应用程序创建一个新文档?◆ 33 ◆如何在多文档MFC程序中制作独立的File|New菜单?◆ 33 ◆如何检测视是否处于分割状态?◆ 34 ◆如何使程序保持极小状态?◆ 34 ◆如何确定当前进程实例是否为唯一实例?◆ 35 ◆如何向一个文档附加多个视?◆ 35 ◆如何获得文件的图标、属性、大小、类型等参数?◆ 36 ◆如何得到鼠标下面的窗口?◆ 37 ◆设置鼠标的形状◆ 38 ◆在对话框中设置编辑EDIT的值◆ 38 1. 如何获取应用程序的实例句柄? 38 2. 如何通过代码获得应用程序主窗口的指针? 38 3. 如何在程序中获得其他程序的图标? 38 4. 如何编程结束应用程序?如何编程控制windows的重新引导? 39 5.怎样加载其他的应用程序? 39 6. 确定应用程序的路径 39 7. 获得各种目录信息 40 8. 如何自定义消息 40 9. 如何改变窗口的图标? 40 10. 如何改变窗口的 缺省风格? 40 11. 如何将窗口居中显示? 41 12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 41 13. 如何使程序保持极小状态? 41 14. 如何限制窗口的 大小? 41 15. 如何使窗口不可见? 41 16. 如何使窗口始终在最前方? 41 17、如何创建一个字回绕的CEditView 42 18、通用控件的显示窗口 42 19、移动窗口 42 20、重置窗口的大小 42 21、如何单击除了窗口标题栏以外的区域使窗口移动 43 22、如何改变视窗的背景颜色 43 23、如何改变窗口标题 44 24、如何防止主框窗口在其说明中显示活动的文档名 44 25、如何获取有关窗口正在处理的当前消息的信息 45 26、如何创建一个不规则形状的窗口 45 27、如何在代码中获取工具条和状态条的指针 47 28、如何使能和禁止工具条的工具提示 47 29、如何设置工具条标题 48 30、如何创建和使用无模式对话框 48 31、如何在对话框中显示一个位图 49 32、如何改变对话或窗体视窗的背景颜色 49 33、如何获取一个对话控件的指针 50 34、如何禁止和使能控件 50 35、如何改变控件的字体 50 36、如何在OLE控件中使用OLE_COLOR数据类型 51 37、在不使用通用文件打开对话的情况下如何显示一个文件列表 51 38、为什么旋转按钮控件看起来倒转 51 39为什么旋转按钮控件不能自动地更新它下面的编辑控件 52 40、如何用位图显示下压按钮 52 41、如何一个创建三态下压按钮 52 42、如何动态创建控件 52 43、如何限制编辑框中的准许字符 53 44、如何改变控件的颜色 54 45、当向列表框中添加多个项时如何防止闪烁 55 46、如何向编辑控件中添加文本 55 47、如何访问预定义的GDI对象 55 48、如何获取GDI对象的属性信息 56 49、如何实现一个橡皮区矩形 56 50、如何更新翻转背景颜色的文本 58 51、如何创建一个具有特定点大小的字体 58 52、如何计算一个串的大小 59 53、如何显示旋转文本 59 54、如何正确显示包含标签字符的串 60 55、串太长时如何在其末尾显示一个省略号 60 56、如何快速地格式化一个CString对象 61 57、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 61 58、如何给系统菜单添加一个菜单项 61 59、如何确定顶层菜单所占据的菜单行数 62 60、在用户环境中如何确定系统显示元素的颜色 62 问:如何控制窗口框架的最大最小尺寸? 63 问:如何改变窗口框架的颜色? 63 问:如何将应用程序窗口置于屏幕正中? 64 问:VC6.0对VC5.0的兼容性? 64 问:打印和打印机的问题? 64 问:CRichEditCtrl滚动条的问题? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化时的大小? 66 问:如何切换视口而不破坏它们? 66 问:改变列表控制时发生闪烁现象? 68 问:处理列表控件可见项的问题? 68 问:产生线程的问题? 68 问:CFile使用了缓冲区吗? 69 问:DAO的密码? 69 问:如何知道CListBox什么时候滚动了? 70 问:视口的不活动性如何处理? 70 问:如何使用COleClientItem的IDispatch接口? 70 问:关于用户自定义的消息使用? 71 问:在打开一个文档时退出? 71 问:在CListCtrl控件中多选择项的删除? 71 问:工作线程的登录状态? 72 问:如何控制菜单的大小? 72 问:改变LVIS_SELECTED的状态颜色? 73 问:如何只存储文档的某一部分? 73 问:保存工具条菜单有bug吗? 73 问:Tip of the day的bug 73 问:如何让我的mfc应用程序可以在最上面? 74 问:如何增加视图中ActiveX控件的事件处理函数? 75 问:如何创建一个动态的Tree控件? 75 问:SDI程序开始时不打开文档? 75 问:List控件中整栏选择? 75 问:如何重载MRU文件? 76 问:CImageList控件中图象橙色被显示为黄色? 76 问:无法正确改变应用程序的图标? 78 问:工具条状态的问题? 78 问:在SDI应用程序中使用Active控件? 79 问:有RichEdit控件的对话框无法正常显示? 79 问:DLL中的模板成员函数? 79 问:CFormView中的上下文帮助? 80 问:CArchive类的WriteObject函数问题? 80 问:RegisterWindowMessage中的BroadcastSystemMessage如何处理? 80 问:CListCtrl中选择变化时如何获得通知? 81 问:如何向ATL-COM对象传送一个数组? 81 问:如何选择CTreeCtrl中的节点文本进行编辑? 82 问:如何改变默认的光标形状? 82 问:如何用键盘滚动分割的视口? 83 问:如何在线程中处理状态条? 83 问:如何阻止WINDOWS关闭? 83 问:如何使一个按钮Disable? 83 问:怎样从MFC扩展动态链结库(DLL)中显示一个对话框? 84 问:想隐藏用户界面怎么办? 85 问:如何实现SDI与MDI的转换? 85 问:CDC中的竖排文本? 86 问:如何激活变灰的弹出菜单? 86 问:线程消息? 87 问:TreeCtrl控制的显示速度太慢? 87 怎样使窗口总是浮现在最上面? 88 改变拖放时的光标外形? 89 如何定位到最新的记录上? 90 MVC和Doc-View? 90 被禁止(Disable)的控件如何改变其文本或背景色? 90 有ODBC的查找函数吗? 91 多个MRU菜单的问题 91 校验框类问题 93 CFormView类的Fold按钮 94 视的背景色 94 隐藏控件台程序 94 修改SDI窗口标题 95 焦点问题 95 从一个OCX调用另一个OCX的方法。 95 得到视 96 字符转化时间 96 二进制还是文本方式? 99 发送消息 99 怎样知道菜单运行时的状态 99 DLL编译出错 100 通用控件的显示窗口 100 如何禁止和使能控件 100 如何在OLE控件中使用OLE_COLOR数据类型 100 在不使用通用文件打开对话的情况下如何显示一个文件列表 100 为什么旋转按钮控件看起来倒转 101 为什么旋转按钮控件不能自动地更新它下面的编辑控件 101 如何动态创建控件 101 如何显示旋转文本 101 在TreeList中使用Edit功能 102 TreeList control中使用check box 103 有关属性对话框(property sheet )的几个提示 108 在MFC加入"这是什么?"的帮助提示 111 精通工具条 112 如何改变视窗的背景颜色 112 为MFC应用程序添加全屏幕显示功能 112 VC常用数据类型使用转换详解 114 用Visual C++操作INI文件 117 单文档加入背景图 119 更新窗体方法 120 更改窗口控件的能动和不能动(以按钮控件为例) 120 窗口响应键盘事件 120 密码框输入受保护 121 最高窗口的实现 122 实现窗口动态写入汉字和改变汉字颜色形状 123
50KB
C语言 动态内存分配详解
2021-01-20C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 \在C语言中,全局变量分配在内存中的静态存储区,非静态的局部变量(包括形参)是分配在内存的动态存储区,该存储区被称为栈。除此之外,c语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必
663KB
高可用的MongoDB集群详解
2021-02-25MongoDB是一个可扩展的高性能,开源,模式自由,面向文档的数据库。它使用C++编写。MongoDB包含一下特点:1.面向集合的存储:适合存储对象及JSON形式的数据。2.动态查询:Mongo支持丰富的查询方式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。3.完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。4.查询监视:Mongo包含一个监控工具用于分析数据库操作性能。5.复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移。6
-
下载
深度学习课程全部的代码、PPT、数据集资源
深度学习课程全部的代码、PPT、数据集资源
-
下载
基于python开发的中国工商企业数据库查询软件v2.5.1下载
基于python开发的中国工商企业数据库查询软件v2.5.1下载
-
下载
RT3070-wifi驱动源码_内有编译步骤
RT3070-wifi驱动源码_内有编译步骤
-
下载
Garuda-开源
Garuda-开源
-
下载
海康威视摄像头多路播放测试_demo.apk
海康威视摄像头多路播放测试_demo.apk
-
下载
OpenGL开发包.rar
OpenGL开发包.rar
-
下载
10个通用的低三分之二标题文字AE模板.mp4
10个通用的低三分之二标题文字AE模板.mp4
-
下载
jasperreports-6.1.1_all_jar.rar资源包下载.zip
jasperreports-6.1.1_all_jar.rar资源包下载.zip
-
下载
diyipptmuban
diyipptmuban
-
下载
2020信息安全技术远程人脸识别系统技术.pdf
2020信息安全技术远程人脸识别系统技术.pdf
