上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 58 下一页
  2014年4月8日
摘要: 在VS2010,进行调试的时候,发现连续定义的int变量,地址相差12个字节。这是为什么?按照我们的理解,int占用4个字节,应该相差4个字节。这是因为VS2010在Debug模式下,int变量占用12个字节。可以这样认为,Debug模式下,在int变量的前后各增加了4个字节,用于存储调试信息,那么... 阅读全文
posted @ 2014-04-08 18:20 Andy Niu 阅读(2452) 评论(0) 推荐(0) 编辑
  2014年4月3日
摘要: 1、什么是智能指针? 所谓智能指针就是,看起来,用起来,感觉起来都像原始指针,但是提供了更多功能。2、使用智能指针取代原始指针,可以获得更多的控制权。如下: a、在构造和析构的时候,可以做一些事。 b、在复制和赋值的时候,可以做一些事。 c、在解引用的时候,可以做一些事。3、智能指针可以对不同类型的指针进行封装,因此智能指针是一个模板类。4、智能指针对原始指针封装,内含一个原始指针,为了用起来像指针,重载->和*,->返回原始指针,*返回对象的引用,两个重载操作符都不改变智能指针,因此是const成员方法。5、考虑auto_ptr,拥有权转移,auto_ptr的copy构造会修改r 阅读全文
posted @ 2014-04-03 19:48 Andy Niu 阅读(578) 评论(0) 推荐(0) 编辑
摘要: 1、考虑二维数组,在栈上分配,必须在编译时确定大小,也就是大小是常量。另外一点,C++不支持在堆上分配二维数组。怎么解决这个问题? 二维数组可以看成,一维数组的数组。因此,可以使用代理类,Array2D的元素是Array1D,Array1D是一维数组,为了支持[][]操作,Array2D重载操作符[],Array1D重载操作符[]。2、区分operator[]的读写操作,考虑string,基于引用计数的string,赋值是浅拷贝,两个指针指向同一块内存。通过[]获取string中的字符,如果只是读取,没有关系,还可以共享。如果是写操作,必须做一个副本。因此,对于[],需要想办法区分是读操作还. 阅读全文
posted @ 2014-04-03 17:02 Andy Niu 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 1、首先考虑一维数组。在栈上分配的数组,必须在编译时确定大小,也就是说大小是常量。在堆上分配的数组,大小可以是变量。2、对于二维数组,在栈上分配,也必须在编译时确定大小,即大小是常量。同时,不能在堆上分配二维数组。 阅读全文
posted @ 2014-04-03 16:51 Andy Niu 阅读(218) 评论(0) 推荐(0) 编辑
  2014年4月2日
摘要: 1、要求对象只能产生于heap之中,该怎么办? 栈上的对象肯定调用构造方法和析构方法(离开作用域的时候),因此,要求对象只能产生于heap之中,也就是禁止栈上产生对象,解决办法有两种:将所有的构造方法声明为private,或者将析构方法声明为private。2、将所有的构造方法声明为private,这样就不能在栈上构造对象了。这有两点需要注意: a、这种情况下,不能在外部使用new operator在堆上构造对象,因为new operator要在分配的内存上,调用构造方法构造对象。因此,需要重新暴露接口,返回堆上的对象。办法有:在类内部使用new operator,暴露static方法;使.. 阅读全文
posted @ 2014-04-02 20:17 Andy Niu 阅读(682) 评论(0) 推荐(0) 编辑
摘要: 1、C++中的delete operator做了两件事:调用析构方法和调用operator delete释放内存。2、考虑析构方法,如果析构方法是虚方法,调用指针真实类型的析构方法,否则调用表面类型的析构方法。3、析构方法的调用分为两个步骤: a、调用子类的析构方法(释放子类动态获取的资源),调用子类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需要做什么),析构子类专有的成分。 b、子类析构方法完成,调用父类的析构方法(释放父类动态获取的资源),调用父类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需.. 阅读全文
posted @ 2014-04-02 18:55 Andy Niu 阅读(1817) 评论(0) 推荐(0) 编辑
摘要: 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 阅读(295) 评论(0) 推荐(0) 编辑
  2014年3月31日
摘要: 1、在未来时态下发展程序,就是接受“事情总会变化”的事实,并准备应对之策。2、记住,程序的维护者通常不是最初的开发者,因此,设计和实现的时候,应该考虑别人更好地理解,修改自己的程序。3、重要的一点就是,以C++语言本身来表现各种规范,而不是依靠注释或者说明文件。举例来说,如果copy构造和copy赋值没有意义,应该将他们声明为private。而不是简单地通过注释告诉用户,不要进行copy构造和copy赋值,因为用户才不管。4、让class的操作符和方法拥有自然的语法和直观的语义,和内置类型保持一致。5、记住,任何事情只要能够做,就会有人做。接受“用户会犯错”的事实。6、努力写出可移植的代码,记 阅读全文
posted @ 2014-03-31 20:12 Andy Niu 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 1、C++和C混合编程的时候,需要考虑产生的目标文件的兼容性。2、名称重整,为什么要搞出名称重整? 连接器要求所有方法名必须独一无二。对于C语言,没问题。C++支持过载,也就是方法名相同,形参表不同的方法,因此编译器编译的时候,必须对方法名重整,保证方法名独一无二,满足连接器的要求。那么问题来了,C++和C混合编程,编译时没有问题,连接时出现问题了,C++进行了名称重载,而C没有,连接时名称对不上了。 怎么解决这个问题?就是使用extern C,告诉编译器,不要进行名称重整。对于C++与C共用的头文件,C++必须使用extern C,而C语言不识别extern C,因此使用预编译。对于__c. 阅读全文
posted @ 2014-03-31 18:54 Andy Niu 阅读(544) 评论(0) 推荐(0) 编辑
  2014年3月25日
摘要: 1、所谓虚化,就是根据引用或者指针的真实类型,决定调用哪个方法。2、构造方法虚化,就是根据引用(或者指针)的真实类型,构造出一个对象,如果指针的真实类型是Base,返回Base*;如果指针的真实类型是Derived,返回Derived*。解决办法是:Base定义一个virtual方法Clone,调用new Base(*this),返回Base*;Derived重写Clone方法,调用new Derived(*this),返回Derived*。注意:一般情况下,子类重写父类方法,要求返回类型必须一致。目前,父类返回Base*,子类重写可以返回Derived*,也就是说C++支持协变。(口诀:进去 阅读全文
posted @ 2014-03-25 19:56 Andy Niu 阅读(281) 评论(0) 推荐(0) 编辑
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 58 下一页