随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万
04 2014 档案
【S16】了解如何把vector和string数据传给旧的API
摘要:1、尽量使用vector和string替换数组,但是老的代码还是使用数组。如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址。2、考虑方法DoSomething(const int* pInt,size_t size),对于vector vec,调用如下: DoSomething(&vec[0], v.size()); 这里有个问题,vec的大小可能为0,更安全的做法是: if(!vec.empty()) { DoSomething(&vec[0], v.size()); }3、考虑,能不能使用begin... 阅读全文
posted @ 2014-04-10 19:22 Andy Niu 阅读(731) 评论(0) 推荐(0) 编辑
【M35】让自己习惯于标准C++语言
摘要:1、最近一些年C++语言增加的特性有: a、RTTI,namespace,bool,关键字mutable和explicit,enums,以及const static int可以直接初始化。 b、扩充了template的弹性,允许成员方法模版。 c、强化了异常处理机制。 d、修改了内存分配例程。2、标准程序库分为以下几项: a、支持C标准程序库。 b、支持String c、支持国别,地域化,本地化,localization。 d、支持I/O e、支持数值应用。 f、支持广泛用途的容器和算法,STL。 阅读全文
posted @ 2014-04-09 16:20 Andy Niu 阅读(231) 评论(0) 推荐(0) 编辑
【M31】让函数根据一个以上的对象类型来决定如何虚化
摘要:1、考虑下面的问题,游戏软件中有角色A,B,角色又可以细化为A1,A2,A3;B1,B2,B3,两类角色之间相互攻击。即A1可以攻击B1,B2,B3,B1可以攻击A1,A2,A3。C++的多态,只根据方法拥有者的真实类型,决定调用哪个方法,而不关心形参的真实类型,只关心形参的表面类型。考虑方法A.Attack(B),如何根据A,B的真实类型虚化?2、使用虚方法+RTTI(运行时期类型识别),在对于A的Attack方法声明为virtual,在重写的方法中,使用typeid判断B的真实类型,决定调用哪个方法。3、只使用虚方法,在A的Attack(B)方法,调用B的AcceptAttack(A)方法 阅读全文
posted @ 2014-04-09 16:03 Andy Niu 阅读(333) 评论(0) 推荐(0) 编辑
【M29】引用计数
摘要:1、引用计数这项技术,是为了让等值对象对象共享同一实体。此技术的发展有两个动机:a、记录堆上分配的对象,是垃圾回收机制的简单原理;b、节省内存,多个对象具有相同的值,存储多次很笨。速度更快,等值对象避免了对象复制,也就减少了构造和析构。2、考虑,基于引用计数的String,String类中有个StringValue指针,stringValue包含char指针data和引用计数refCount。注意,refCount属于StringValue,不应该属于String,否则要有多个引用计数副本,还要保持同步。3、考虑下面的问题,多个String共享同一个StringValue,如果只是读取操作,没 阅读全文
posted @ 2014-04-09 16:02 Andy Niu 阅读(345) 评论(0) 推荐(0) 编辑
C++ 数组
摘要:1、在栈上分配的数组,大小必须在编译时确定,也就是编译时常量。在堆上分配,大小可以是变量。思考,为什么? 在栈上分配数组,可以认为直接在栈顶挪出一块内存,必须直到大小。2、数组名是一个指针常量,不能修改指向。3、在大部分情况下,可以把数组名认为是一个指针(不能修改指向),但是有两种情况需要注意,数组名不是指针:a、sizeof(数组名)计算数组的长度;b、对数组名取地址&,返回的是数组首地址,也就是说&a和a相等。考虑指针的情况,对于sizeof(指针),大小是4个字节。对于指针,存在三个值:a、指针本身的地址,也就是指针存放在哪里;b、指针值,指针指向的地址;c、指针解引用, 阅读全文
posted @ 2014-04-08 18:23 Andy Niu 阅读(503) 评论(0) 推荐(0) 编辑
栈上连续定义的int变量,地址相差12个字节
摘要:在VS2010,进行调试的时候,发现连续定义的int变量,地址相差12个字节。这是为什么?按照我们的理解,int占用4个字节,应该相差4个字节。这是因为VS2010在Debug模式下,int变量占用12个字节。可以这样认为,Debug模式下,在int变量的前后各增加了4个字节,用于存储调试信息,那么... 阅读全文
posted @ 2014-04-08 18:20 Andy Niu 阅读(2459) 评论(0) 推荐(0) 编辑
【M28】智能指针
摘要:1、什么是智能指针? 所谓智能指针就是,看起来,用起来,感觉起来都像原始指针,但是提供了更多功能。2、使用智能指针取代原始指针,可以获得更多的控制权。如下: a、在构造和析构的时候,可以做一些事。 b、在复制和赋值的时候,可以做一些事。 c、在解引用的时候,可以做一些事。3、智能指针可以对不同类型的指针进行封装,因此智能指针是一个模板类。4、智能指针对原始指针封装,内含一个原始指针,为了用起来像指针,重载->和*,->返回原始指针,*返回对象的引用,两个重载操作符都不改变智能指针,因此是const成员方法。5、考虑auto_ptr,拥有权转移,auto_ptr的copy构造会修改r 阅读全文
posted @ 2014-04-03 19:48 Andy Niu 阅读(579) 评论(0) 推荐(0) 编辑
【M30】代理类
摘要:1、考虑二维数组,在栈上分配,必须在编译时确定大小,也就是大小是常量。另外一点,C++不支持在堆上分配二维数组。怎么解决这个问题? 二维数组可以看成,一维数组的数组。因此,可以使用代理类,Array2D的元素是Array1D,Array1D是一维数组,为了支持[][]操作,Array2D重载操作符[],Array1D重载操作符[]。2、区分operator[]的读写操作,考虑string,基于引用计数的string,赋值是浅拷贝,两个指针指向同一块内存。通过[]获取string中的字符,如果只是读取,没有关系,还可以共享。如果是写操作,必须做一个副本。因此,对于[],需要想办法区分是读操作还. 阅读全文
posted @ 2014-04-03 17:02 Andy Niu 阅读(255) 评论(0) 推荐(0) 编辑
C++数组
摘要:1、首先考虑一维数组。在栈上分配的数组,必须在编译时确定大小,也就是说大小是常量。在堆上分配的数组,大小可以是变量。2、对于二维数组,在栈上分配,也必须在编译时确定大小,即大小是常量。同时,不能在堆上分配二维数组。 阅读全文
posted @ 2014-04-03 16:51 Andy Niu 阅读(220) 评论(0) 推荐(0) 编辑
【M27】要求或者禁止对象产生于heap之中
摘要:1、要求对象只能产生于heap之中,该怎么办? 栈上的对象肯定调用构造方法和析构方法(离开作用域的时候),因此,要求对象只能产生于heap之中,也就是禁止栈上产生对象,解决办法有两种:将所有的构造方法声明为private,或者将析构方法声明为private。2、将所有的构造方法声明为private,这样就不能在栈上构造对象了。这有两点需要注意: a、这种情况下,不能在外部使用new operator在堆上构造对象,因为new operator要在分配的内存上,调用构造方法构造对象。因此,需要重新暴露接口,返回堆上的对象。办法有:在类内部使用new operator,暴露static方法;使.. 阅读全文
posted @ 2014-04-02 20:17 Andy Niu 阅读(689) 评论(0) 推荐(0) 编辑
C++ delete operator做了什么事
摘要:1、C++中的delete operator做了两件事:调用析构方法和调用operator delete释放内存。2、考虑析构方法,如果析构方法是虚方法,调用指针真实类型的析构方法,否则调用表面类型的析构方法。3、析构方法的调用分为两个步骤: a、调用子类的析构方法(释放子类动态获取的资源),调用子类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需要做什么),析构子类专有的成分。 b、子类析构方法完成,调用父类的析构方法(释放父类动态获取的资源),调用父类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需.. 阅读全文
posted @ 2014-04-02 18:55 Andy Niu 阅读(1818) 评论(0) 推荐(0) 编辑
【M33】将非尾端类设计为抽象类
摘要:1、考虑下面的需求,软件处理动物,Cat与Dog需要特殊处理,因此,设计Cat和Dog继承Animal。Animal有copy赋值(不是虚方法),Cat和Dog也有copy赋值。考虑下面的情况: Cat cat1; Cat cat2; Animal *a1 = &cat1; Animal *a2 = &cat2; *a1 = *a2; 思考*a1 = *a2会有什么问题? copy赋值不是虚方法,根据表面类型,调用Animal的copy赋值,这就导致所谓的部分赋值,cat2的Animal成分赋值给cat1的Animal成分,二者的Cat成分保持不变。2、怎么解决上面的问题? 将 阅读全文
posted @ 2014-04-02 11:53 Andy Niu 阅读(297) 评论(0) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示