
C++
指尖上星空
这个作者很懒,什么都没留下…
展开
-
序列的排序
排序的稳定性和不稳定性: 对需要排序的数据元素序列,将其按关键字进行排序,若相同关键字元素之间的位置关系,排序前与排序后的相对位置不发生变化,称这种排序方法是稳定的,相反是不稳定的。内部排序和外部排序: 内部排序是指待排序列完全存放在内存中所进行的的排序过程,适合记录较少的序列。如果待排序列记录数量非常大,排序过程不能在内存中一次完成,必须对外存储器进行访问,原创 2013-03-05 10:22:07 · 1385 阅读 · 0 评论 -
C++异常机制
程序在运行时可能会遇到运行阶段的错误,导致程序无法继续运行。例如,程序试图打开一个不可用的文件或请求过多的内存。一般情况下程序员都会尽量在编码时避免这类情况发生,但有时却不一定能防止。例如在算术表达式中,出书不能是0是基本的常识,但是在多数情况下出书是否为0在编译阶段是未知的。常用的异常处理有两种类型:调用abort()使异常终止以及使用异常机制进行一场处理;1)调用abort是一种常用终原创 2013-04-09 13:40:13 · 830 阅读 · 0 评论 -
C++STL简介
一、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码从广义上讲分为三类:algorithm(算法)、co转载 2013-05-02 20:52:04 · 706 阅读 · 0 评论 -
string系列之strcpy、strncpy、strcmp、strlen编程实现
string系列char* strcpy( char *strDest, const char *strSrc ) { assert((strDest != NULL) && (strSrc != NULL) );char *address = strDest; while((*strDest++ = * strSrc++) != ‘\0’ ); return addre原创 2013-05-04 12:04:38 · 968 阅读 · 0 评论 -
C++多继承的二义性
多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。 多继承下派生类的定义格式如下: class :,,… { }; 其中,,,…是三种继承方式:public、private、protected之一。例如: class A {转载 2013-05-18 15:24:35 · 1005 阅读 · 0 评论 -
int *ptr=(int*)(&a+1);
main(){int a[5]={1,2,3,4,5};int *ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int *ptr=原创 2013-05-06 10:02:45 · 2428 阅读 · 0 评论 -
数组与指针的区别
在C语言中对于下面的两种情况,是否相同呢?char a[] = "abcdefg";---------------1char *p = "abcdefg";-----------------2在谈到这些区别时,应该先谈一下计算机中对变量是如何存储的。从编译原理中我们知道,对于所有的变量他都会影射到一个符号表中。为了简化,这里给出一种最简单的便于理解的符号表:原创 2013-05-07 18:54:15 · 768 阅读 · 0 评论 -
singleton模式
Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance)。很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中;例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个 连接物件,所有其它的程式都透过转载 2013-05-10 07:52:51 · 940 阅读 · 0 评论 -
int* pInt = new int(5)和int* pInt = new int[5]的区别
int *p = new int(5); 这句是从堆上分配一个int型变量所占的字节内存,这个内存单元存放的整数值为5,然后让一个整形的指针变量p指向它的地址。释放方式:delete p;int *p = new int[5]; 这句相当于从堆上分配一个含有5个元素的整形数组所占的字节内存,然后让一个整形的指针变量p指向它的首址。释放方式:delete []p;(注意这个[]不转载 2013-05-13 09:14:09 · 1382 阅读 · 0 评论 -
线程和进程的区别及优缺点:
线程和进程的区别: 1)进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位; 2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(程序的计数器、一组寄存器和栈),但是它可以同属一个进场的其他的线程共享进程所拥有的全部资源;原创 2013-03-12 11:28:10 · 2006 阅读 · 0 评论 -
AfxBeginThread和CreateThread具体区别
具体说来,CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式,在使用的过程中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁的因素,用起来比较繁琐一些,初学的人在用到的时候可能会产生不可预料的错误,建议多使用AfxBeginThread,是编译器对原来的CreateThread函数的封装,用与MFC编程(当然,只要修改了项目属性原创 2013-03-05 15:56:02 · 808 阅读 · 0 评论 -
C++面试题之编程实现
1)给你个数组1……n进行排序,时间复杂度为O(n),空间复杂度是O(1),#includeint main(){int a[] = {10,6,9,5,2,8,4,7,1,3};int len = sizeof(a) / sizeof(int);int temp;for(int i = 0; i {temp = a[a[i] - 1];a[a[i] - 1原创 2013-03-19 07:57:06 · 953 阅读 · 0 评论 -
COM与DLL的区别和联系
com英文为Component Object Model(组件对象模型),是微软生产软件组件的标准。它是构造二进制兼容软件组件的规范,不管组件应用何种语言编写只要遵循com规范就可以相互直接通信。提出com规范主要是为了满足: 1.程序的快速开发,可以将一个大型的工程分成若干个com组件同时开发。 2.可以动态的插入或卸载com组件。 3.可以隐藏或封装com组件内部的实现细节。转载 2014-03-06 17:26:07 · 1075 阅读 · 0 评论 -
C++中智能指针的设计和使用
转载请标明出处,原文地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对转载 2015-07-28 10:46:26 · 527 阅读 · 0 评论 -
VC中操作INI文件的函数
VC中操作INI文件的函数主要有:函数名功能备注GetPrivateProfileInt 读取INI文件指定块中的键名对应的整数值。 GetPrivateProfileSection记取INI文件指定块中的所有键名及其对应值。 GetPrivateProfileSectio转载 2015-08-19 20:48:25 · 767 阅读 · 0 评论 -
C++类大小的计算
球类占用内存大小的总结: 1)计算类大小就是计算类中的有多少个成员变量,其中静态成员变量是不占用类的大小; 2)在计算成员变量的时候编译器会根据对其原则进行处理;如: class A { void Function(); int i; char c;原创 2018-02-03 15:28:59 · 431 阅读 · 0 评论 -
动态链接库两种调用方式的比较
一、动态链接库的概念 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。 动态链接是原创 2013-03-25 08:23:13 · 1837 阅读 · 0 评论 -
C++虚函数及虚函数表解析
虚函数的定义: 虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public(可以定义为private or proteceted, 但是对于多态来说,没有意义。),在基类的类定义中定义虚函数的一般形式: virtual 函数返回值类型 虚函数名(形参表) { 函数体 }虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,转载 2013-04-03 16:39:56 · 961 阅读 · 0 评论 -
全局变量/静态全局变量/局部变量/静态局部变量
在介绍之前先讲讲内存的分布情况: 内存由代码区、全局数据区、堆区和栈区。其中堆区的数据由new或者是malloc所申请的内训所驻留的;栈区的数据是在执行函数内部的自动变量得来的;全局数据区的数据是全局变量和静态变量的,包括静态全局变量和静态局部变量;代码区存储的数据就是代码; 全局变量: A、该变量在全局数据区分配内存。 B、原创 2013-03-12 10:40:05 · 899 阅读 · 0 评论 -
静态数据成员和静态成员函数
静态数据成员: 静态数据成员是类的成员,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的; 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义; 因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它原创 2013-03-12 11:11:39 · 1145 阅读 · 0 评论 -
字节对齐提高执行效率
#include "stdafx.h"#include #pragma pack(4)struct A{ char a; int b;};#pragma pack()#pragma pack(1)struct B{ char a; int b;};#pragma pack()int main(int argc, char* arg原创 2013-03-04 14:52:21 · 801 阅读 · 0 评论 -
整形数据
一)整形数据的存储和数值范围1、计算机使用的是二进制的形式来存储数据,计算机内的存储单元是位(bit),每一位都可以表示1位二进制数(即0或者1),比如8位的存储单元,可以表示的二进制的范围是0000 0000~1111 1111,即十进制的0~255。2、计算机的内存使用8位(bit)表示一个字节Byte简写B(注意,是大写B,小写b表示的是一位),1KB=1024B,1MB=1024K原创 2013-03-13 18:58:19 · 2645 阅读 · 0 评论 -
C基本数据类型的转换顺序
自动类型转换:自动将精度低,表示范围小的运算对象类型向精度高表示范围大的运算对象类型转换。以便得到较高精度的运算结果。double ←—— float 高 ↑ long ↑ unsigned ↑ int ←—— char,short 低 ● 图中横向箭头表示必须的转换,在表达式中有char 或者short型数据,一律转换为int 型参加运算。如两个float型数参加原创 2013-03-15 17:26:36 · 2810 阅读 · 0 评论 -
C++实现遍历目录
所谓遍历目录,就是给定一个目录,访问其中的所有文件(包括子目录下的文件)。迭代是比较常用的遍历算法。本文利用C++面向对象的特性,通过一个类CBrowseDir,对目录遍历进行了封装。用户只需掌握该类四个成员函数的用法,就可以在自己的程序中,很方便地实现目录遍历。 类CBrowseDir使用了迭代算法。因为算法不是本文重点,笔者不打算展开进一步讨论,对其感兴趣者可参考相关资料。 一原创 2013-03-28 08:51:58 · 1489 阅读 · 0 评论 -
编译l链接的原理
编译过程又可以分成两个阶段:编译和汇编。 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段: 第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。如#include指令就是一个预处理指令,它把原创 2013-03-17 14:34:05 · 910 阅读 · 0 评论 -
VC里进行系统时间设置
使用API函数SetLocalTime进行本地时间设置。 ◦ SetLocalTime函数的原型: BOOL SetLocalTime( const SYSTEMTIME *lpSystemTime ); 输入参数lpSystemTime是一个SYSTEMTIME类型的参数,如果设置成功,返回true,本地时间将会变成lpSystemTime所指定的时间,否则返回false。看一下SYSTEM原创 2013-03-17 12:50:21 · 1328 阅读 · 0 评论 -
C++各种相似对象的区别
1、数组指针和指针数组的区别 .数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维原创 2013-03-05 10:20:26 · 875 阅读 · 0 评论 -
C++数据类型转换
C++ 同时提供了四种新的强制转型形式(通常称为新风格的或 C++ 风格的强制转型): const_cast(expression); dynamic_cast(expression); reinterpret_cast(expression); static_cast(expression); c原创 2013-03-14 17:16:16 · 703 阅读 · 0 评论 -
C++内存分配方式及常见错误
内存分配方式有三种: (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3) 从堆上分配,亦称动态内存分配。程原创 2013-03-17 19:08:08 · 898 阅读 · 0 评论 -
套接字的创建过程
服务器端1)SOCKET:服务器首先创建一个流式套接字,相当于准备了一个插座;2)BIND:将这个套接字于特定的网络地址联系到一起,这个叫做绑定,相当于安装插座;对于Internet,网络地址 = IP地址 + 传输层端口号。3)LISTEN:启动监听套接字做好准备,进入监听状态。规定坚挺套接字所能接受的最多的客户机端的连接请求;4)ACCEPT:接收客户机端的连接请求。分两种情原创 2013-03-19 09:57:21 · 2899 阅读 · 0 评论 -
单线程和多线程选择处理
对于处理时间短的服务或者启动频率高的要用单线程,相反用多线程!不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程某此操作允许并发而且该操作有可能阻塞时, 用多线程. 例如SOCKET, 磁盘操作.使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决的问题变得容易起来。但是,不应该人为地将编写的程序分成一些碎片,让这些碎片按 各自的线转载 2013-03-19 20:54:49 · 1523 阅读 · 0 评论 -
动态链接库的两种实现方法
1. Load-time Dynamic Linking 载入时动态链接这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。2. Run-time Dynamic Linking 运行时动态链接原创 2013-03-19 21:18:50 · 1204 阅读 · 0 评论 -
peekmessage与GetMessage和VC之SendMessage与PostMessage的区别
SendMessage与PostMessage的区别:SendMessage函數是阻塞的。PostMessage函數是非阻塞的。SendMessage:函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。函数原型:LRESULT SendMes原创 2013-03-19 21:58:39 · 2587 阅读 · 0 评论 -
字长对齐带来的效率提升
#include "stdafx.h"#include #pragma pack(4)struct A{ char a; int b;};#pragma pack()#pragma pack(1)struct B{ char a; int b;};#pragma pack()int main(int argc, char* arg原创 2018-02-03 15:29:25 · 353 阅读 · 0 评论