const 与指针
摘要:1、分为两种情况:指向const对象的指针,const在*的左边,不能修改指向的内容。const指针,const在*的右边,不能修改指针的指向。2、赋值给指针的时候,可以缩小权限,但是不能放大权限。也就是说,非const对象可以赋值给指向const对象的指针。但是,const对象不能赋值给指向非co...
阅读全文
posted @
2015-03-07 20:47
Andy Niu
阅读(1223)
推荐(0) 编辑
声明重写的虚方法,必须定义
摘要:1、只有声明,没有定义,编译没有问题。2、连接的时候,查找方法的定义,只对调用的方法进行连接。3、没有定义。如果没有调用相应的方法,连接也没有问题。如果调用了相应的方法,报错 LNK2001: unresolved external symbol,无法解析的外部符号4、有一种情况,需要注意。那就是...
阅读全文
posted @
2015-02-07 09:49
Andy Niu
阅读(877)
推荐(0) 编辑
理解PV操作和信号量
摘要:对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。P操作从仓库拿货,如果仓库中没有货,线程一直等待,直到V操作,往仓库里添加了货物,为了避免P操作一直等待下去,会有一个超时时间。V操作往仓库送货,如果仓库满了,线程等待,直到有P操作,从仓库中拿走货物,有空的位置。创建信号量,设置容量...
阅读全文
posted @
2015-01-12 22:03
Andy Niu
阅读(45693)
推荐(3) 编辑
静态库与动态库相互调用
摘要:测试场景,Test,lib1,lib2,dll1,dll2,分为下面四种情况:1、Test->lib1->lib2lib1编译自己的代码,对lib2的部分,只需要lib2的头文件,对lib2的代码实现,使用占位符关联。生成Test连接的时候,把lib1的代码实现包含进来,再递归,把lib1中关联li...
阅读全文
posted @
2015-01-10 18:33
Andy Niu
阅读(4885)
推荐(0) 编辑
避免资源泄露的一个方法
摘要:1、一个资源,很多人用,如果大家都不delete,必定造成资源泄露2、如果多个人进行delete,必定导致未定义行为。3、因此,只能有一个delete,而且必须是最后一个使用者进行delete。4、那么问题来了,我怎么知道谁是最后一个使用者?在多线程的环境中更加不可能判断出来。那怎么办呢?5、不要想...
阅读全文
posted @
2014-06-20 17:22
Andy Niu
阅读(646)
推荐(0) 编辑
C++ 数组
摘要:1、在栈上分配的数组,大小必须在编译时确定,也就是编译时常量。在堆上分配,大小可以是变量。思考,为什么? 在栈上分配数组,可以认为直接在栈顶挪出一块内存,必须直到大小。2、数组名是一个指针常量,不能修改指向。3、在大部分情况下,可以把数组名认为是一个指针(不能修改指向),但是有两种情况需要注意,数组名不是指针:a、sizeof(数组名)计算数组的长度;b、对数组名取地址&,返回的是数组首地址,也就是说&a和a相等。考虑指针的情况,对于sizeof(指针),大小是4个字节。对于指针,存在三个值:a、指针本身的地址,也就是指针存放在哪里;b、指针值,指针指向的地址;c、指针解引用,
阅读全文
posted @
2014-04-08 18:23
Andy Niu
阅读(504)
推荐(0) 编辑
栈上连续定义的int变量,地址相差12个字节
摘要:在VS2010,进行调试的时候,发现连续定义的int变量,地址相差12个字节。这是为什么?按照我们的理解,int占用4个字节,应该相差4个字节。这是因为VS2010在Debug模式下,int变量占用12个字节。可以这样认为,Debug模式下,在int变量的前后各增加了4个字节,用于存储调试信息,那么...
阅读全文
posted @
2014-04-08 18:20
Andy Niu
阅读(2460)
推荐(0) 编辑
C++数组
摘要:1、首先考虑一维数组。在栈上分配的数组,必须在编译时确定大小,也就是说大小是常量。在堆上分配的数组,大小可以是变量。2、对于二维数组,在栈上分配,也必须在编译时确定大小,即大小是常量。同时,不能在堆上分配二维数组。
阅读全文
posted @
2014-04-03 16:51
Andy Niu
阅读(220)
推荐(0) 编辑
C++ delete operator做了什么事
摘要:1、C++中的delete operator做了两件事:调用析构方法和调用operator delete释放内存。2、考虑析构方法,如果析构方法是虚方法,调用指针真实类型的析构方法,否则调用表面类型的析构方法。3、析构方法的调用分为两个步骤: a、调用子类的析构方法(释放子类动态获取的资源),调用子类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需要做什么),析构子类专有的成分。 b、子类析构方法完成,调用父类的析构方法(释放父类动态获取的资源),调用父类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需..
阅读全文
posted @
2014-04-02 18:55
Andy Niu
阅读(1818)
推荐(0) 编辑
C++ for循环效率
摘要:1、考虑二维数组,在C++中,以先行后列的方式存储连续的数组元素。也就是同一行的元素在一起,同一列的元素之间有间隔,且间隔相同。理想情况下,二维数组的元素是随机访问的,可以直接定位,即i*列数+j。因此,对于二层for循环访问二维数组的元素,先行后列与先列后行的效率应该是一样的。但是,二维数组的数据往往需要多个内存分页才能容纳,由于C++同一行的元素在一起,先行后列,更符合空间局部性,可以减少换页。因此,先行后列的效率高。2、考虑二层for循环,有大循环和小循环。大循环在内部效率高。为什么?可简单地认为,跨越循环层是个耗时耗资源的操作,大循环在内部,跨越循环层的次数少。从另一方面理解,大循环在
阅读全文
posted @
2014-03-25 17:57
Andy Niu
阅读(2401)
推荐(0) 编辑
理解回调方法
摘要:1、回调方法是什么? 回调方法是把方法作为实参传递给另一个方法,比如传给Fun,Fun的形参是方法指针,回调方法与方法指针类型要匹配,在Fun中完成对方法的调用。2、回调方法解决什么问题?也就是说,它的使用场景是什么? a、事件驱动程序,点击按钮,我们期望做某件事,把自定义的方法传递过去。 b、在STL中,特别常用。STL中的算法,形参往往是个方法指针,允许用户自定义查询条件(也就是一个方法),传递给算法,算法负责调用这个方法。 c、异步回调方法,典型的情况如:socket编程中,acceptor.async_accept(client, callback)。可认为在异步方法async...
阅读全文
posted @
2014-03-05 19:43
Andy Niu
阅读(778)
推荐(0) 编辑
理解sizeof
摘要:1、sizeof返回的是字节个数,内存编址的最小单元是字节。因此,空对象,bool值占用的内存也是一个字节。2、可以对哪些东西求sizeof ? a、对象和类型。如int a; sizeof(a), sizeof(int),二者是等价的。同一类型的对象,大小是一致的,并且在内存中的布局也是一样的,这样编译器才能够按照统一的方式去解释。可以认为sizeof(a),转化为sizeof(int)进行求值。 b、不能对方法名和void,计算sizeof。 c、可以对指针计算sizeof,所有指针的大小都是4个字节。包括:指向数据的指针,指向方法的指针,指向void的指针。3、对于数组名,非常特殊...
阅读全文
posted @
2014-03-04 20:23
Andy Niu
阅读(586)
推荐(0) 编辑
传值与传引用
摘要:1、在C++中,可认为只有传值和传引用。传指针本质上就是传值。将a指针传给b指针,两个指针是两个对象(而引用是别名),它们的值相等,即a、b指向同一块内存。这个时候,要千万注意:修改指针使它指向另一块内存与修改指针指向的内容之间的区别。以b为例说明,修改b使它指向另一块内存,a不变,还是指向原来的内存,内容也不变。修改b指向的内容,由于a,b指向同一块内存,也就是修改a指向的内容,a内容发生变化。2、复制指针是浅拷贝,两个指针地址相同,共享同一块内存。如何进行深拷贝? 把原指针指向的内容做一个整体拷贝,新指针指向拷贝的内容,这就是深拷贝。注意:深拷贝后,每个指针指向不同的内存,内容相等,但是.
阅读全文
posted @
2014-03-04 19:59
Andy Niu
阅读(1779)
推荐(0) 编辑
C++异常
摘要:相对于C语言,C++增加了异常机制。考虑,异常解决了什么问题,又带来了什么问题。异常解决了什么问题:1、问题检测与问题处理相分离。2、C语言只是返回一个整数,而异常带有上下文信息,方便找出问题。3、C语言返回的整数,可能忘记检查,而异常不可忽略,必须处理。4、异常可以跳级,发生异常后,堆栈回滚,保证栈上的对象析构。异常带来了什么问题:1、代码膨胀。抛出异常,保证栈上的对象析构,编译器必须插入一些代码。2、效率低,抛出异常,必然有临时对象的产生。
阅读全文
posted @
2014-03-03 19:24
Andy Niu
阅读(262)
推荐(0) 编辑
理解extern
摘要:extern有两层含义:表示声明和extern C1、C++分为编译期和运行期,C++是分别单独编译,编译期可认为有三个步骤:a、预编译进行文本替换,将源文件(cpp文件)生成编译单元;b、编译单元经过编译生成目标文件(obj文件);c、所有目标文件连接生成库(dll文件)或者可执行文件(exe文件)。2、在每个编译单元中,要使用一个对象,有两种方式: a、在当前把它定义出来 b、告诉编译器,我有这个东西,但是它被定义在其他的编译单元,等到连接时找到它。这就是extern的第一个用法。3、extern修饰对象,说明只是声明,对象定义在其他地方,连接的时候找到他。可以编译通过,但是,你引用的..
阅读全文
posted @
2014-02-28 20:21
Andy Niu
阅读(1576)
推荐(0) 编辑
变量的属性
摘要:1、变量有三个基本要素:类型,名称,值。除了这三个要素,还包括其他内容:存储类型,作用域范围,连接类型(可见性),生存期。2、以方法为例说明,方法的类型就是去掉方法名,包括返回类型和形参表,如void (int)。名称就是方法名,方法名表示方法体代码在内存中的地址,在编译时就确定其值,因此是一个常量,这就是方法的值。方法的存储类型默认为extern,只是声明。作用域范围就是文件作用域,连接类型为extern,除非声明为static,为内链接。生存期为永久,从程序运行到程序终止。
阅读全文
posted @
2014-02-28 19:20
Andy Niu
阅读(936)
推荐(0) 编辑
C++ 内存相关
摘要:1、C++的内存管理可分为以下几个部分: 栈:记录程序的执行过程。 堆:采用new,delete申请释放内存。 自由存储区:对应于C中使用malloc,free申请释放内存。 全局存储区:也叫静态存储区,存储static对象,包括全局对象,命名空间内对象,文件作用域内的static对象,类中的static对象,方法内的static对象。 常量存储区:存放文本常量。2、对于32位系统,堆可用大小为为4G,对于一般程序,可认为无限大。栈可用大小为1M,也可以人为修改。3、 1Byte = 8Bit 1Word = 2Byte 1K = 1024Byte 1M = 1024K 1G...
阅读全文
posted @
2014-02-28 19:12
Andy Niu
阅读(289)
推荐(0) 编辑
C++ 中复杂的声明
摘要:1、方法也是有类型的,方法的类型由返回类型和形参表决定。比如int F (int)的类型就是去掉方法名,int (int)。2、对于方法类型,在返回类型和形参表之间,加上一个名称F,就表示一个特定的方法F。3、思考,如果我在返回类型和形参表之间,加上一个指针变量呢? 表示指向这一类方法的指针。即int (*P) (int),需要特别注意的是,必须使用括号把*P括起来。如果没有括起来,int *P(int),从编译器的角度理解,就变成了返回int指针的方法声明。4、那么接着思考,方法指针也是指针,既然方法能够返回其他指针,当然也可以返回方法指针。 方法指针的类型就是去掉指针名称,int(*)..
阅读全文
posted @
2014-02-21 19:06
Andy Niu
阅读(726)
推荐(0) 编辑
指向成员的指针
摘要:1、从封装的角度看,类可认为是一个命名空间,名称就是类名。类中有两个成员:字段和方法。2、指针可以指向任何对象,当然也可以指向类中的字段和方法。那么该如何指向类中的字段和方法呢?3、分别是: int Animal::*pData = &Animal::_age; int (Animal::*pFun)() = &Animal::getAge;4、我们定义指向类中字段或者方法的指针,往往是为了通过指针和对象绑定一起,去修改字段或者访问方法,这种情况下,我们不需要直到类的字段名或者方法名。该怎么做呢? 既然是指向字段或者方法的指针,通过*解引用,就得到了字段或者指针。对于对象使用.
阅读全文
posted @
2014-02-21 18:33
Andy Niu
阅读(225)
推荐(0) 编辑
指针与引用的操作符
摘要:1、对于指针*,声明或者定义的时候,表示变量为指针。在其他的地方,如果是单目操作,表示对指针解引用,如果是双目操作,表示乘法。2、对于引用&,声明或者定义的时候,表示变量为引用。在其他的地方,如果是单目操作,表示取地址,如果是双目操作,表示按位与。3、声明或者定义指针的时候,*可以紧靠类型,也可以紧靠变量,二者是等价的。但是推荐的编码风格是,紧靠变量。为什么? a、紧靠类型,会产生错觉。比如int* i, j; 有些人会认为定义了i,j两个int指针。而实际情况是i是int指针,j是int变量。使用int *i, j; 可以避免产生这种错觉。 b、考虑指向成员的指针,从封装的角度看,类
阅读全文
posted @
2014-02-21 18:09
Andy Niu
阅读(642)
推荐(0) 编辑