上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 58 下一页
  2014年2月12日
摘要: 1、引用必须初始化,而且不能修改指向,这一点和const对象十分相似。2、引用和指针用法不同,对于引用int& ri = a; rhs是个对象,引用前面加&;对于指针,int* pi = &a; rhs是个对象地址,指针前面加*。注意:引用往往是用指针实现的,从int& ri = a; 可以认为a赋给ri,再取地址。3、引用是一个对象的别名,不能指向为空,而且自始至终是这个对象的别名。指针是地址,可以指向为空,也可以指向不同的对象。4、考虑对引用初始化:引用是一个对象的别名。引用不能指向为空,但是通过一定技巧,可以让引用指向为空。考虑,先让指针指向为空(0),解 阅读全文
posted @ 2014-02-12 18:13 Andy Niu 阅读(420) 评论(0) 推荐(0) 编辑
  2014年2月11日
摘要: 1、首先,确认什么是临时对象。在swap方法中,建立一个对象temp,程序员往往把temp称为临时对象。实际上,temp是个局部对象。C++中所谓的临时对象是不可见的,产生一个non-heap对象,并且没有命名,便是一个临时对象。2、临时对象的来源有:隐式类型转换,方法返回值,抛出异常的时候。3、隐式类型转换:在初始化或者赋值的过程中,如果类型不匹配,需要一个适配的临时对象,编译器会构造这个临时对象,使调用成功。 注意:这种适配,只能执行一次,不能执行多次。为什么?假如可以执行多次,从一个对象到另一个对象,存在很多转换路径,编译器不可能找出所有的路径。就算可以找出所有的路径,存在多条转换路径. 阅读全文
posted @ 2014-02-11 20:24 Andy Niu 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 1、catch语句的参数有三种方式:by pointer,by value,by reference。2、首先考虑,by pointer。这意味着抛出端必须抛出一个对象的地址。那么问题来了: 如果这个对象分配在栈上,离开作用域,对象销毁,catch语句中指针指向一堆垃圾。 因此,这个对象不能分配在栈上,也就是说,离开了作用域对象仍然存在,没有销毁。那就只能是static对象,或者是heap对象。那么问题又来了,在catch语句的客户端,客户到底要不要执行delete呢?客户不知道这个对象是static还是heap对象。如果执行delete,而抛出端的对象是static,对不是在heap上分.. 阅读全文
posted @ 2014-02-11 19:38 Andy Niu 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 1、方法参数的声明语法和catch语句的语法是一样的,你可能会认为主调方法调用一个方法,并向其传递参数,与抛出一个异常传递到catch语句是一样的,是的,有相同之处,但也有更大的不同。2、主调方法调用一个方法,控制权转移,被调方法执行完,控制权最终还会返回到主调方法。但是,抛出异常到达catch语句,控制权不会再回到抛出端。3、那么问题来了,抛出异常到达catch语句,控制权不再会到抛出端,这意味着,抛出的异常离开了作用域,自动销毁,那么catch语句还怎么捕获异常对象呢? 解决办法是:建立一个临时对象,对抛出的异常进行copy构造。特别注意的是,不管什么情况,这个临时对象是必不可少的。根本. 阅读全文
posted @ 2014-02-11 18:56 Andy Niu 阅读(655) 评论(0) 推荐(0) 编辑
  2014年2月10日
摘要: 1、TMP(template metaprogramming),模版元编程有两个效力:第一,它让某些事情更容易;第二,可将工作从运行期转移到编译期。 阅读全文
posted @ 2014-02-10 20:18 Andy Niu 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 1、template是产生代码的代码,这就意味着源码看起来很少,生成的目标码大量膨胀。2、考虑,如果两个方法有重复代码,我们会新建一个方法,把重复的代码放进去,原先两个方法调用第三个方法。如果两个类有重复代码,我们把重复代码移到一个新的类中,通过继承或者复合,避免重复。3、但是在template中,这种重复是隐晦的,只有一份template代码,可能会生成一系列重复的代码。考虑矩阵模板类,有两个模版形参:矩阵元素的类型T和矩阵的大小S。4、SquareMatrix 和SquareMatrix 会实例化两个模板类,这两个模板类有大量重复代码,比如:invert方法。5、如何解决呢? 建立一个模. 阅读全文
posted @ 2014-02-10 20:03 Andy Niu 阅读(824) 评论(0) 推荐(0) 编辑
摘要: 1、non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参。non-member方法与member方法唯一的区别是:member方法封装性更差,因为它可以访问private成员。2、根据面向对象的要求,数据与方法应该和对象捆绑在一起,这意味着应该使用member方法。其实,这个建议是错误的。为什么?3、首先,non-member、non-friend方法提供更大的封装性。4、其次,考虑下面的需求,我只需要类中的一个方法。如果是member方法,必须把整个class 阅读全文
posted @ 2014-02-10 19:16 Andy Niu 阅读(1022) 评论(0) 推荐(0) 编辑
摘要: 1、为什么要将成员变量声明为private,语法一致性,只通过方法暴露接口。2、使用方法,可以对成员变量更精确的控制。比如:为所有可能的实现提供弹性,不同实现可以替换;控制可读可写;验证约束条件;处理事前和事后状态;在多线程环境执行同步控制。3、public会破坏成员变量的封装性,程序中到处都可修改成员变量。将成员变量声明为private,暴露一个方法接口,可以统一管理。4、对于成员变量,protected并不比public更具封装性。 阅读全文
posted @ 2014-02-10 18:41 Andy Niu 阅读(516) 评论(0) 推荐(0) 编辑
摘要: 1、考虑有理数Rational,有个友元操作符*,返回Rational对象。返回对象,导致临时对象的构造,析构。效率低,因此会想返回方法内局部对象的引用,这种方法不可行。为什么?2、调用方法是在stack上执行,方法执行完毕,局部对象销毁。假如返回方法内局部对象的引用,方法执行完,局部对象销毁,这时候,引用指向一堆垃圾。3、你可能会想,我在heap上构造一个对象,返回引用。这也不可行,首先,要求客户端负责delete,这不合理。其次,退一步说,就算客户负责,执行delete。但是有些情况,客户无法执行delete。比如:Rational d = a*b*c; a*b的结果没有暴露出来,客户无法 阅读全文
posted @ 2014-02-10 18:21 Andy Niu 阅读(302) 评论(0) 推荐(0) 编辑
  2014年1月24日
摘要: 原文:http://blog.csdn.net/c504665913/article/details/7797859如果一个人自称为程序高手,却对内存一无所知,那么我可以告诉你,他一定在吹牛。用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针。笔者今天在这里并不是要讨论如何避免这些问题,而是想从另外一个角度来认识C++内存对象。 我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储区。既然如此,我称位于它们之中的对象分. 阅读全文
posted @ 2014-01-24 20:04 Andy Niu 阅读(4444) 评论(0) 推荐(1) 编辑
上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 58 下一页