2013年12月2日
摘要: 什么是引用计数?一个在堆上创建的对象,记录有多少个指针指向它。为什么要设计引用计数,他解决什么问题?1、new出一个临时对象,使用完了,需要delete。但是拥有权会转移(auto_ptr)或者扩散,因此很难确定delete时机。忘记delete导致资源泄漏,过早delete,导致还在使用的指针出现错误,重复delete导致未定义行为。2、许多对象拥有相同的值,存储多次是个很愚蠢的事,可以共享。如何实现:1、以String为例说明,String s1 = "Hello", String s2 = s1; 可以让s1,s2共享"Hello"。2、引用计数放 阅读全文
posted @ 2013-12-02 20:45 Andy Niu 阅读(1376) 评论(0) 推荐(0)
摘要: 1、学习C++的过程,经常发现C++不支持一些东西,思考下,为什么?2、C++不支持一些东西,有两个原因: a、可以做到,但是会导致一些不合理的结果,这些结果往往与程序员的期望不一致。 b、属于“臣妾做不到啊”3、对于第一种情况,比如: a、传引用,存在隐式类型转换,会建立一个临时对象。对引用的修改,不能体现在原对象身上,与程序员期望不一致,C++不支持。 b、p++++,编译器不支持。4、对于第二种情况,比如: C++不支持模版的分离式编译。5、C++能做什么,不能做什么,往往是由C++编译器决定的。C++做不到,往往是因为编译器做不到。比如: a、比如,不能这样创建对象Pers... 阅读全文
posted @ 2013-12-02 19:44 Andy Niu 阅读(281) 评论(0) 推荐(0)
摘要: 1、C++不支持模版的分离式编译,为什么? C++是分别,单独编译,对于每个cpp文件,预编译为编译单元,这个编译单元是自包含文件,编译的时候,不需要其他的文件,编译好了,生成obj文件,然后连接成exe文件。在编译的时候,使用一个东西,如果这个东西就在当前位置,当然好了。如果不再当前位置,也没关系,只要说,我有这个东西就行,这个东西在其他地方。在连接的时候,会找到这个东西在什么地方。 考虑普通方法,通过上面的分析,是没有问题的。考虑模版方法: Fun.h声明一个方法模版,Fun.cpp包含Fun.h,并定义了方法模版,main.cpp包含Fun.h,然后使用方法。单独编译Fun.cpp... 阅读全文
posted @ 2013-12-02 19:34 Andy Niu 阅读(1357) 评论(0) 推荐(0)
摘要: 1、为什么要进行方法名重整? C++支持过载,允许方法名相同,形参表不同。对于同名的方法,编译器根据形参表的不同,对方法名重整为另一个方法名,也就是建立一种映射。这就是为什么要进行方法名重整。同时编译器,进行了扩展,也就是说,没有过载的方法也进行了方法名重整。2、方法名重整带来的问题 C中没有过载的概念,也就是不允许出现同名的方法。因此,也就没有方法名重整。考虑下面的情况:在C++使用C语言库中的方法,int add(int a);C中提供了add方法的实现,C++中包含头文件,声明方法,然后使用。C代码生成的目标文件中,方法名没有重整,还是add,而C++代码方法名进行了重整,假设重整为.. 阅读全文
posted @ 2013-12-02 19:01 Andy Niu 阅读(262) 评论(0) 推荐(0)
摘要: 1、考虑下面的场景:有一个Person类,内部有个age字段,对外提供前缀式和后缀式,把年龄加1。2、前缀式与后缀式都没有右操作数,也就是说没有形参,需要区分前缀式和后缀式,对于后缀式中增加一个形参。因为这个形参在方法内并不使用,可以省略形参名。3、前缀式和后缀式是操作符重载,本质上是方法,和GetName()一样。4、前缀式:1 Person& Person::operator ++()2 {3 this->age = this->age+1;4 return *this;5 }5、后缀式:1 const Person Person::operator ++(int)2 阅读全文
posted @ 2013-12-02 18:29 Andy Niu 阅读(3501) 评论(0) 推荐(0)