
c++
文章平均质量分 79
FlowShell
这个作者很懒,什么都没留下…
展开
-
关于位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制转载 2009-08-31 19:31:00 · 641 阅读 · 0 评论 -
inside C++笔记之默认构造函数
<br />C++ Annotated Reference Manual告诉我们:“default constructors…在需要的时候别编译器产生出来”。这里的需要是编译器的需要,不是程序的需要,程序的需要是程序员的责任。<br />编译器合成出一个default constructor只执行编译器所需的行动。也就是说如果一个class没有任何构造函数,编译器不一定会为它合成一个defualt construtor。只有以下4中情况,编译器才会为class在需要的时候合成一个default constr原创 2010-10-28 19:58:00 · 952 阅读 · 0 评论 -
c++程序处理过程
<br /><br />上图是可程序程序的生成过程,线上的是各个阶段生成的文件。主要有以下几个过程:<br /> 首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开,例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换。例如ifdef/ifndef就是从一个文件中有选择性的挑出一些符合条件的代码来交给下一步的编译阶段来处理。这里面最复杂的莫过于include了,其实也很简单转载 2010-11-07 21:41:00 · 1057 阅读 · 0 评论 -
C++模板编译过程
<br />如何组织编写模板程序 <br /><br />前言<br />常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。<br />我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是 “传统”编程方法(在*.h文件声明,在*.cpp文件中定义转载 2010-11-10 12:10:00 · 5234 阅读 · 0 评论 -
c++的虚拟内联函数
<br />我们曾经在讨论C++的时候,经常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了。现在听到的是:“你不应该使print成为内联的。声明一个虚函数为内联是错误的!”<br />这种说法的两个主要的原因是(1)虚函数是在运行期决议而内联是一个编译期动作,所以,我们将虚函数声明为内联并得不到什么效果;(2)声明一个虚函数为内联导致了函数的多分拷贝,而且我们为一个不应该在任何时候内联的函数白白花费了存储空间。这样做很没脑子。<br />不过,事实并不是这样。我们先来看看第一转载 2010-11-08 21:01:00 · 1274 阅读 · 0 评论 -
内存碎片之如何产生
<br /> malloc/free或new/delete大量使用后回造成内存碎片,那么这种碎片形成的机理是什么? <br /> 如果机理是申请的内存空间大小(太小)所形成的,那么,申请多大的区域能够最大限度的避免内存碎片呢?(这里的避免不是绝对的避免,只是一种概率)<br /> 内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。产生内存碎片的方法很简单,举个例: <br /> 假设有一块一共有100个单位的连续空闲内存空间,范围是0~99转载 2010-11-09 09:55:00 · 10082 阅读 · 2 评论 -
C++模板
在C++开发中,模板分为函数模板:函数模板和类模板。 模板参数可以是一个模板类型参数,它代表了一个类型;也可以是一个模板非类型参数,它代表了一个常量表达式,即,它必须能在编译时被计算出结果。例如:template class Buf{....};template class BufPtr{...};int size_val = 1024;const int c_size_val = 1024;Buf buf1 //okBuf buf2 //okBuf原创 2010-11-09 22:43:00 · 1118 阅读 · 0 评论 -
指向类的成员的指针
<br />在C++中,可以说明指向类的数据成员和成员函数的指针。<br /><br /> 指向数据成员的指针格式如下:<br /><br /> <类型说明符><类名>::*<指针名><br /><br /> 指向成员函数的指针格式如下:<br /><br /> <类型说明符>(<类名>::*<指针名>)(<参数表>)<br /><br /> 例如,设有如下一个类A:<br /><br /> class A<br /> {<br />转载 2010-11-12 19:20:00 · 1172 阅读 · 0 评论 -
变量的定义,初始化和声明
<br />变量的定义、初始化和声明在学高级编程语言时已经讲到过的,不过通过自己的编程经验,这里面有一些基本的本质问题要掌握。 <br />1-definition 变量的定义<br />变量的定义主要是为变量申请内存空间用。(编译器要管理该变量名字和申请该变量的内存大小)<br />比如: QObject * myobject;<br />int x;<br />第一个语句是定义一个指针类型的变量myobject,4个字节的内存空间。(在这里一定要与QObject * myobject=new QObje转载 2011-03-25 14:38:00 · 2718 阅读 · 0 评论 -
C++模板中的名称
名称的分类:标识符、运算符id、类型转换函数id、模板id、非受限id、受限id、受限名称、非受限名称、依赖性名称、非依赖性名称如果一个名称使用域解析运算符或者成员访问运算符来显式表明它所属的作用域,就称该名称为受限名称。如果一个名称依赖于模板参数,就称为依赖性名称。名称查找:受限名称的名称查找是在一个受限作用域内部进行的,该受限作用域由一个限定的构造所决定,如果该作用域是一个类,那么查找范围可以到达它的基类;但不会考虑它的外围作用域。非受限名称的查找则相反,可以在所有外围类中逐层地进行查找(但在某个类内部原创 2011-03-28 22:39:00 · 3298 阅读 · 0 评论 -
C++模板实例化
实例化:一个通过使用具体值替换模板参数,从模板产生的普通类,函数或者成员函数的过程。特化:就是上述过程最终获得实体。延迟实例化:当隐式实例化类模板时,同时也实例化了该模板的每个成员声明,但并没有实例化相应的定义,然而,存在例外:1.如果类模板包含了一个匿名的union,那么该union定义的成员同时也被实例化了2.作为实例化类模板的结果,虚函数的定义可能被实例化,但也可能没有,这依赖于具体实现C++的实例化模型:两阶段查找:第1阶段:发生在模板的解析阶段非依赖型名称:普通查找+ADL非受限的依赖型名称:普通原创 2011-03-29 12:12:00 · 20894 阅读 · 0 评论 -
C++模板特化与重载
<br />重载函数模板:<br />#include <iostream>template<typename T> int f(T){ return 1;}template<typename T> int f(T*){ return 2;}int main() { std::cout << f<int*>((int*)0) << std::endl; //输出1 std::cout << f<int>((int*)0) << std::endl原创 2011-03-29 15:28:00 · 8142 阅读 · 1 评论 -
int在64位机或64位编译器中到底占用几个字节
数据类型 LP64 ILP64 LLP64 ILP32 LP32 char 8 8 8 8 8 short 16 16 16 16 16 _int32 N/A 32 N/转载 2013-11-28 19:41:49 · 4186 阅读 · 0 评论 -
C++ extern 详解
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不转载 2015-02-10 15:25:06 · 636 阅读 · 0 评论 -
placement new
1、placement new 为何物?placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替(不像普通版本的operator new 和 operator delete能够被替换)。void *operator new( size_t, void *p ) throw() { return p; }placement转载 2015-02-10 15:27:10 · 671 阅读 · 0 评论 -
数组指针与指针数组
这个问题大家应该都碰到过,指针数组和数组指针,刚开始看时觉得还是能看懂,但是过些时又搞混了,最后发现还是没有真正理解。 下面就简单说说这两个概念: 一:指针数组,顾名思义,就是说的首先是一个数组吧,然后数组的元素是指针而已。 说明形式为:type *pointer_array[constant1][constant2]...[constantn]; 例如:int *pai[3]转载 2015-02-10 15:26:25 · 525 阅读 · 0 评论 -
文件打开的几种方式(c/c++/win32/mfc)
<br />以打开"myfile.txt"为例。<br />1,在c中使用的传统的<stdio.h><br /> FILE* fp;<br /> char* fn = "myfile.txt";<br /> fp = fopen(fn, "a+");<br /> if( fp != NULL )<br /> {<br /> //use file<br /> }<br /> fclose(fp);<br /> <br />2, 在c++推荐使用的<f转载 2010-12-21 21:11:00 · 3317 阅读 · 0 评论 -
左值右值
<br /> 左值(lvalue)和右值(rvalue)是编程中两个非常基本的概念,但是也非常容易让人误解,看了很多文章,自我感觉真正将这个问题讲的很透彻的文章还没有看见,所以自告奋勇来尝试一下。如果左值右值的概念不是非常清楚的话,它们迟早会像拦路虎一样跳出来,让你烦心不已,就像玩电脑游戏的时候每隔一段时间总有那么几个地雷考验你的耐性,如果一次把所有地雷扫尽就好了。:)<br /> 左值(lvalue)和右值(rvalue)最先来源于编译理论(感谢南大小百合的programs)。在C语言中表转载 2010-12-08 11:31:00 · 2164 阅读 · 0 评论 -
C++位操作介绍
C++位操作包括两种:传统的C语言方式的位操作和C++中利用bitset容器的位操作 一、传统的C方式位操作:1.基本操作: 使用一个unsigned int变量来作为位容器。2.操作符:| 按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。& 按位与操作符::resu转载 2009-09-09 11:45:00 · 615 阅读 · 0 评论 -
C++ __int64用法
在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。 那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编转载 2009-10-02 23:43:00 · 1046 阅读 · 0 评论 -
vc定时用法
VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作。 方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应转载 2009-10-03 00:00:00 · 971 阅读 · 0 评论 -
字节对齐详解
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从转载 2009-12-23 17:11:00 · 706 阅读 · 0 评论 -
内存地址对齐及大小端
我们常常看到“alignment", "endian"之类的字眼, 但很少有C语言教材提到这些概念. 实际上它们是与处理器与内存接口, 编译器类型密切相关的.考虑这样一个例子: 两个异构的CPU进行通信, 定义了这样一个结果来传递消息:struct Message{ short opcode; char subfield; long message_length;转载 2009-12-23 17:23:00 · 1136 阅读 · 0 评论 -
描述编译和链接过程
[yc]详解link 详解link有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(V转载 2010-05-16 17:58:00 · 669 阅读 · 0 评论 -
链表
以下是常用链表的算法:#include #include #include using std::vector;typedef struct _node{ int value; _node* pNext; _node(int va):value(va),pNext(0){}}NODE,*PNODE;//创建一个链表void CreateList(原创 2010-05-19 17:25:00 · 731 阅读 · 0 评论 -
inside C++笔记之C++对象模型
C++模型原创 2010-07-29 08:27:00 · 850 阅读 · 0 评论 -
inside C++笔记之拷贝构造函数
C++拷贝构造函数原创 2010-07-29 08:54:00 · 682 阅读 · 0 评论 -
inside C++笔记之C++数据布局
C++对象的DATA布局原创 2010-07-29 09:09:00 · 860 阅读 · 0 评论 -
inside C++笔记之虚函数
C++虚函数原创 2010-07-29 09:18:00 · 1051 阅读 · 0 评论 -
函数参数中带省略号的用法
可变参数转载 2010-08-13 20:03:00 · 6880 阅读 · 0 评论 -
C++ 中的命名空间 namespace
C++之Namespace转载 2010-08-13 19:22:00 · 778 阅读 · 0 评论 -
几个常用C语言函数
C语言之常用函数原创 2010-08-15 13:28:00 · 874 阅读 · 0 评论 -
C语言逗号表达式
<br />(a=3*5,a*4).a+5 <br />应该是<br />(a=3*5,a*4),a+5 吧<br /><br />逗号表达式注意两个基本知识:<br />1. 逗号表达式的运算顺序是从左向右运算<br />2. 逗号表达式的值取逗号中最右表达式的值<br /><br />现在看(a=3*5,a*4),a+5这个逗号表达式,<br />首先对于(a=3*5,a*4)和a+5来说,按照从左向右运算先计算(a=3*5,a*4)<br /><br />(a=3*5,a*4)<br />这个逗号表达转载 2010-10-17 16:10:00 · 7072 阅读 · 2 评论 -
内存的分配方式
对于我们初学者来说,内存是个神秘的空间。程序的绝大部分错误,也是在于内存的使用不当造成的,而且这些错误有些都是隐藏很深的。所以,如何掌握内存的使用,通晓系统对内存的管理手段,将是软件成功的一个非常关键的因素。 首先我们要了解内存的分配方式。一般来说,内存的分配方式有三种:1.从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,转载 2015-02-10 15:28:15 · 1293 阅读 · 1 评论