随笔分类 - C/C++
摘要:软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚...
阅读全文
摘要:一个通常的函数调用的例子://声明(一般头文件中)void MyFun(int x); //此处的申明也可写成:void MyFun( int );int main(int argc, char* argv[]){ MyFun(10); //这里是调用MyFun(10);函数 return 0;}v...
阅读全文
摘要:本文将介绍几个 Boost 实用工具类,包括 tuple、static_assert、pool、random 和 program_options等等。需要对标准 STL 具备一定的了解才能充分理解本文的内容。 1.boost::tuple 类 有时,希望 C++ 函数返回多个不相关的值。在推出 ST
阅读全文
摘要:在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。和纯粹的面向对象程序设计语言不同,C++中的多态有着更广泛的含义。除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,带变量的宏,模板,函数重载,运算符重载,拷贝构造等也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为静态多态(static polymorphism)。静态多态性1、函数重载与缺省参数(1)函数重载的实现原理假设,我们现在想要写一个函数(如Exp01),它即可以计算整型数据又可以计算浮点数,那样我们就得
阅读全文
摘要:当我们越来越多的使用C++的特性,将越来越多的问题和事物抽象成对象时,我们不难发现:很多对象都具有共性。比如数值可以增加、减少;字符串也可以增加减少。它们的动作是相似的,只是对象的类型不同而已。C++提供了“模板”这一特性,可以将“类型”参数化,使得编写的代码更具有通用性。因此大家都称模板编程为“通用编程”或“泛型编程”。一般而言,模板分为函数模板和类模板,下面就让我们分别来了解一下它们。一、函数模板1、函数模板的定义和使用定义一个模板函数的格式并不复杂,如下:template返回类型函数名(函数参数列表){//code...}下面,让我们来举一个例子来说明模板函数的作用和用法(具体代码见Ex
阅读全文
摘要:一、什么是字节对齐,为什么要对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,
阅读全文
摘要:extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern
阅读全文
摘要:原文来自:http://blog.sina.com.cn/s/blog_5f8817250100i3oz.html这里并没不是讨论大学课程中所学的《编译原理》,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白)。要明白的几个概念:1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。2、编译单元:根据C++标准,每一个CPP文件就是一个编译单元。每个编译单元之间是相互独立
阅读全文
摘要:关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用mu
阅读全文
摘要:容器,迭代器与容器适配器所谓容器,即是将最常运用的一些数据结构(data structures)用类模板实现出来,用于容纳特定类型的对象。根据数据在容器中排列的特性,容器可概分为序列式(sequence)和关联式(associative)两种。容器的好处,那就是它不需要你预先告诉它你要存储多少对象,只要你创建一个容器对象,并合理的调用它所提供的方法,所有的处理细节将由容器来自身完成,它可以为你申请内存或释放内存,并且用最优的算法来执行您的命令。迭代器是一种检查容器内元素并遍历元素的数据类型,它提供类似指针的功能,用于对容器的内容进行走访。适配器是使一事物的行为类似于另一事物的行为的一种机制,是
阅读全文
摘要:只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数叫做复制构造函数(有时也称为拷贝构造函数),例如:class Person{public: Person();//默认构造函数 Person(const Person&);//复制构造函数 ....................};与默认构造函数一样,复制构造函数可由编译器隐式调用,它主要用于以下几种情况:(1)根据另一个同类型的对象显示或者隐式初始化一个对象(2)复制一个对象,将它作为实参传给一个函数(3)从函数返回时复制一个对象(4)初始化顺序容器中的对象(5)根据元素初始化式列表初始化数组元素C
阅读全文
摘要:函数的形参为函数提供了已命名的局部存储空间,它是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化,而形参的初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名,具体分析如下:1.非引用形参普通的非引用类型的参数通过复制对应的实参实现初始化,而当实参副本初始化形参时,函数并没有访问所传递的实参本身,因此这不会改变实参的值,例如:int fun(int v1,int v2){ while(v2) { int temp=v2; v2=v1%v2; v1=temp; } return v1;}while循环体虽然修改了v1和v...
阅读全文
摘要:首先,我们应该明确的是在C++中初始化不是赋值,因为初始化是必要的,如果读取了未初始化的值将会导致不明确的行为。初始化指创建变量并且给它赋初值,而赋值则是擦除对象的当前值并用新值代替。C++支持两种初始化变量的方式:复制初始化和直接初始化: int ival(1000);//直接初始化是将初始化式放在括号里 int ival=1000;//复制初始化是用等号(=)那么这两种方式有什么区别呢?我们可以这样认为,对于内置类型来说,复制初始化和直接初始化几乎没有差别,对于类类型来讲,当创建类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制
阅读全文
摘要:引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径。但是它们的差别还是挺大的: 先从它们的值说起,一个有效的指针值通常具有三种面孔,一是保存一个特定对象的地址,而且一般是用取地址符号“&”把该特定对象的地址拿出来赋给指针;二是0值,此时表明它不指向任何对象,尽管任一个int型变量的值可能为0,但是直接把int型变量赋给指针是非法的,不过,如果是在编译时可以获得0值的const变量则指针对它网开一面,也就是说,int s=0;int *p=s 是不行的,但是 const int s=0;
阅读全文
摘要:C库函数中字符串处理函数集合bcmp原型:extern int bcmp(const void *s1, const void *s2, int n);用法:#include 功能:比较字符串s1和s2的前n个字节是否相等说明:如果s1=s2或n=0则返回零,否则返回非零值。bcmp不检查NULL。bcopy原型:extern void bcopy(const void *src, void *dest, int n);用法:#include 功能:将字符串src的前n个字节复制到dest中 说明:bcopy不检查字符串中的空字节NULL,函数没有返回值。bzero 原型:extern v..
阅读全文
摘要:许多同学可能在学习C++的时候,都会感到一定的困惑,继承到底是怎样分配空间的,多态到底是如何完成的,许许多多的问题,必须挖掘到C++底层处理机制,才能搞明白。有许多C程序员也并不认同C++,他们认为C++庞大又迟缓,其更重要的原因是,他们认为“C++是在你的背后做事情”。的确,C++编译器背着程序员做了太多的事情,所以让很多不了解其底层机制的人感到困惑。想成为一个优秀的程序员,那么这样的困惑就不应该存在,只有了解了底层实现模型,才能写出效率较高的代码,自信心也比较高。 我们先从一个简单但有趣的例子谈起。有如下的4个类:class X {};class Y : public virtual X
阅读全文