摘要:什么是SQLitePP ? SQLitePP 是一个C++封装的 SQLite组件,开源、免费。目的是使用面向对象的方式来简化SQLite的使用,具有面向对象的访问方式。开源工程:http://sourceforge.net/projects/sqlite4pp/ 欢迎各位开发人加入!如何使用?1. 从这里下载最新的版本,http://sourceforge.net/projects/sqlite4pp/files,目前仅有基于MSVC2010的版本,欢迎各位开发者加入,开发其他平台和版本。2. 将 include 中的头文件 sqlitepp.h 加入到你的工程, lib中的 sqlitep
阅读全文
摘要:SQLite 强大,大家都知道,但是原生是C接口,用来其应用层稍微麻烦些。今天做了个简单的C++封装,使用面向对象的方法来使用。优点:面向对象的方式,减少应用层的复杂性;缺点:暂对多线程环境支持不足。使用样例如下:// a simple example to use SQLitePP
void simple_example()
{ //define a connection SQLitePP::DBConnection conn; // connect to a database int rc = conn.connect("D:\\mytestdb.db"); if (r
阅读全文
摘要:1、 内存分配方式(1)从静态存储区域分配。例如使用static、全局变量。静态存储区的数据在程序编译的时候就已经分配好了,在程序运行期间一直存在,只有在程序推出之后才会释放。(2)在栈上分配。函数内部的局部变量都是在栈上分配的,在函数阶数时存储空间便被释放;(3)在堆上分配。程序员根据自己的需要申请和释放内存(new/delete malloc/free)2、在内存的分配过程中经常会出现一些错误。(1)内存未分配成功却使用了他。例如内存中没有足够大的剩余空间此时内存分配(new/malloc)失败之后会返回NULL,可以用assert(p!=NULL)或者if语句进行检查。(2)内存分配成功
阅读全文
摘要:一个由C/C++编译程序占用内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数参数值,局部变量值等。其操作方式类似于数据结构中栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量存储是放在一块,初始化全局变量和静态变量在一块区域, 未初始化全局变量和未初始化静态变量在相邻另一块区域。 - 程序结束后由系统释放。-->分别是data区,bbs区4、文字常量区 —常量字符串就是放在这里。 程序结束后由系
阅读全文
摘要:最近两天在复习一些c++的知识,中间发现了许多以前没有注意过的问题。关于句柄以前总是将其理解为指针,其实不然,他们之间有着明显的区别。 首先,指针指向系统中物理内存的地址,而句柄是windows在内存中维护的一个对象内存物理地址列表的整数索引,句柄是一种指向指针的指针。 在windows系统中的内存管理一般会将当前处于空闲状态的对象的内存释放掉,当需要访问的时候再重新提交分配物理内存,从而导致对象的物理地址是变化的,这样就不允许系统直接通过指针来访问(物理地址不断变化)的对象。 句柄是一种指向指针的指针。由于windows是一种以虚拟内存为基础的操作系统,其内存管理器经常会在内存中来...
阅读全文
摘要:虚函数表对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。这里我们着重看一下这张虚函数表。在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的
阅读全文
摘要:volatile在英文中的解释是“不稳定的”,也就是说用该关键字修饰的变量的值随时可能被改变。用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。 计算机中进行计算时,通常会将数据拷贝到寄存器中,因为CPU对寄存器的操作远快于对内存的操作。 在变量没有使用volatile修饰时,如果在计算过程中没有对该变量所在的...
阅读全文
摘要:静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明的static变量,可作为对象间的一种通信机制 如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它的定义使初始化。用法2:局部静态对象 对于局部静态对象,构造函数是在控制线程第一次通过该对象的定义时调用。在程序结束时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。用...
阅读全文
摘要:一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:数组——编译时分配的数组空间大小;指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);类型
阅读全文
摘要:1、const_cast<type>(content)主要用于修改数据类型的const和volatile属性,#include <string>#include <iostream>using namespace std;class B{public:int m_iNum;B() {m_iNum=9;}};void foo(){const B b1;//b1.m_iNum = 100; //compile errorB b2 = const_cast<B&>(b1);//const_cast中的type必须为指针或者引用,将常量对象转换成
阅读全文
摘要:http://blog.vckbase.com/arong/archive/2009/12/30/40598.html1. 原理分析经常有些新C++程序员问:C++的类的成员个数是不是有限制,为什么我加一个变量后程序就死了?或者说:是不是成员变量的顺序很重要,为什么我两个成员变量顺序换一换程序就不行了?凡此种种之怪现象,往往都是内存访问越界所致。何谓内存访问越界,简单的说,你向系统申请了一块内存,在使用这块内存的时候,超出了你申请的范围。例如,你明明申请的是100字节的空间,但是你由于某种原因写入了120字节,这就是内存访问越界。内存访问越界的后果是:你的写入破坏了本不属于你的空间。下面是一个
阅读全文
摘要:在C++中提供了类型向上转换和向下转换的方法。关于向上转换和向下转换区别如下:1、从派生类转换到基类,在继承图中来说是向上的,所以一般称为向上类型转换。向上类型转换总是安全的,因为从更专门的类型转换到更一般的类型。可能出现的唯一的事情就是失去成员函数。向上转换可以通过虚函数来实现。下面的程序就是一个向上转换的例子:class base{base(){}virtual ~base(){}};class derived:public base{derived(){}virtual ~derived(){}};void main(){base *Base=new derived;//这里就是将der
阅读全文
摘要:#include "stdafx.h"#include <iostream.h>struct A{int a;unsigned __int64 b;short c;}Test_a;struct B{int a;short c;unsigned __int64 b;}Test_b;struct C{short a;short b;short c;}Test_c;struct D{unsigned __int64 a;short b;int c;int d;unsigned __int64 e;}Test_d;int main(){cout<<sizeo
阅读全文
摘要:C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。一、Const作用如下表所示:No.作用说明参考代码1可以定义const常量 const int Max = 100;2便于进行类型检查const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误void f(const int i
阅读全文
摘要:问题描述:将一个字符串例如abcd123向左旋转移位4位变为123abcd;或者右移4位变为d1234abc;要求写一个函数实现对该字符串的这两种操作。方法一:最容易想到的方法当然是(以左移为例)一次移动一位,一共移动四次,这样便可以将上述字符串左移4位。abcd123-->bcd123a-->cd123ab-->d123abc-->123abcdLeftShift(int* arr, int N, int K) //arr为字符串,N为字符串的长度,K为左移的长度{ K %= N; while(K--) { int t = arr[0]; for(int i =0;
阅读全文
摘要:2009年参加了全国大学生电子竞赛,经过全队三人的努力,最终荣获全国一等奖(当年浙江省本科组全国一等奖好像一共5个队伍),在这里特别感谢武林老师,是他为我们创造了这么好的条件,才能够在电子竞赛的道路上走的更加顺畅。我也是在今天整理资料的时候忽然发现了这篇文章,这是我很久之前写的,本来想拿出来发表的,但是研究生导师说没有什么理论深度。我个人认为对于大多数本科生来说还有一定的参考价值。声音导引系统及信号采集处理电路设计 陈庆霆 武林 沈卫极 吴武飞摘要:本文介绍了一种通过固定频率的音频信号实现对可移动声源的引导和控制的方法,分析了音频信号采集电路的设计思路以及控制算法的实现。设计了对固定频率的音.
阅读全文
摘要:在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int byte long...1、dataType (*num)[n] = new dataType [m][n];//这是一个数组指针形式的定义,即每一行是一个指针...delete []num;缺点:n必须是已知优点:调用直观,连续储存,程序简洁2、 dataType ** num= new dataType *[m];for(int i = 0; i < m; i++)num[i] = new dataType [n];...for(int i = 0; i < m; i
阅读全文
摘要:看到一个别人的对话框资源,感觉还挺好用的,于是想复制过来,复制步骤如下:方法一:1、复制别人的*rc文件到自己的工程目录下,然后改成你自己工程里*rc文件的文件名;2、复制别人的resource.h文件到你的工程目录下(这个文件里面保存了Dialog文件的标示符)方法二:1、打开 工程-->添加到工程-->文件 打开你需要的*rc文件 2、打开你导入的dialog文件,拷贝你需要的对话框资源到自己原来的dialog文件中
阅读全文
摘要:以前,Qt windows 只有商业版才支持 Visual Studio, Opensource 版只能使用 MinGW, 无论开发调试都很麻烦。虽说最近 Qt 出了一款 QtCreator 用来专门支持 Opensource 开发,而且配备了强大的 debug helper 来支持 MinGW(Linux/Unix/Mac 下直接支持 GCC, GDB),但是在windows上开发,最爽的还是 Microsoft 出品的原生编译器和调试器, 相信你也不喜欢看到 MinGW 编译出来的 debug 版本 QtCored4.dll 有几十兆吧。经过前几天研究发现, Opensource版本也可以
阅读全文
摘要:声明: 本文中有部分理论和思想源于《C++设计新思维:泛型编程与设计模式之应用》一书,向作者 Andrei Alexandrescu 大师致敬!写多了代码,如果要想代码以后便于维护,系统结构清晰,便于扩展,必然要使用一些能够复用的、已经经过实践证明是成功的、大家约定俗成的方法;自从多年前“四人帮”(GangofFour)那四个老爷子总结出来23中模式后,大家一致探讨、沿用至今,被实践证明是最好用的,最成功的。单例模式(Singleton)是其中最常用、最实用的一种模式。什么是单例(Singleton)呢?Gof说:“保证一个class只有一个实例(instance),并为它提供一个全局访问点(
阅读全文