上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 58 下一页
  2014年2月20日
摘要: 1、我们知道程序的入口是main方法,那么在执行main方法之前,需要做些什么准备工作呢?2、main方法执行之前,必须要把non-local static对象构造完成。static对象有:全局对象,命名空间中的对象,类的static对象(从封装的角度看,类也是一个命名空间),方法内的static对象,其中方法中的static对象是local static对象,其他的是non-local static对象,这些对象分配在全局区,程序结束才释放内存。3、local static对象直到方法被调用的时候,才进行初始化,而且只初始化一次。non-local static必须在main方法执行之前,进 阅读全文
posted @ 2014-02-20 20:05 Andy Niu 阅读(4565) 评论(0) 推荐(0) 编辑
摘要: 1、复制控制包括:copy构造,copy赋值,析构方法。2、没有声明任何构造方法,编译器自动生成一个default构造方法。对于copy构造,copy赋值和析构方法,没有声明,编译器会自动合成一个。3、合成的copy构造,做的事情是:逐个字段初始化,将新对象初始化为原对象的一个副本。所谓的逐个成员初始化,只是指实例字段,不包括static字段,因为static字段是共享的。如果字段是值类型,直接赋值。如果字段是类类型,递归调用copy构造方法。有个情况很例外,一般情况下,不能复制数组,但是对于类中的数组,合成copy构造将复制数组中的每一个元素。4、合成的copy赋值,做的事情:除了stati 阅读全文
posted @ 2014-02-20 19:28 Andy Niu 阅读(747) 评论(0) 推荐(0) 编辑
摘要: 1、C++类本身没有访问权限的概念,就是class Base。2、类成员的访问权限有:public、protected、private3、类的继承方式有:public、protected、private 阅读全文
posted @ 2014-02-20 18:56 Andy Niu 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 1、相对于C中struct,C++做了很大的扩充。基本上和class 差不多。只有一些细节上的差别。2、对于成员的默认访问权限,class是private,struct是public。需要注意的是,程序中应该明确指出访问权限,不要依赖默认的访问权限。对于其它默认的情况也是一样,尽量明确指出来,这是一个良好的编程习惯,增加代码的可读性。3、对于默认的继承方式,class是private,struct是public。需要注意的是,class可继承class,也可继承struct。struct可继承struct,也可继承class。默认的继承方式取决于子类是struct还是class。和上面一样,这 阅读全文
posted @ 2014-02-20 18:53 Andy Niu 阅读(1970) 评论(0) 推荐(0) 编辑
  2014年2月17日
摘要: 1、以字符串形式出现的,编译器会在结尾自动添加\0,思考,为什么? 存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针。strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0表示结尾。只有字符数组才有\0的概念,其它类型(int)的数组没有这个概念。因为其他类型的数组或者... 阅读全文
posted @ 2014-02-17 20:48 Andy Niu 阅读(58935) 评论(4) 推荐(1) 编辑
  2014年2月16日
摘要: 1、存储模型,对象可以保存多少个值。如果只能保存一个值,是原子类型。如果可以保存多个值,是容器类型。数值是原子类型,元组,列表,字典是容器类型。考虑字符串,按道理,字符串应该是容器类型,因为它包含多个字符。但是,Python中没有字符类型,也就是没有字符的概念,因此,把字符串归为原子类型。2、更新模型,对象的值是否可以更新。Python彻底分离了引用和实体,比如a=1; b=a; b=2; 可以认为,a指向的内存内容不允许修改,现在b也指向这块内存,那么我要修改b,该怎么办呢? 只能是重新分配一块内存,内容为2,然后修改b的指向,让b指向这块内存。a还是指向原来的内存,内容不变。 思考,P.. 阅读全文
posted @ 2014-02-16 22:22 Andy Niu 阅读(2732) 评论(0) 推荐(0) 编辑
  2014年2月13日
摘要: 从高地址到低地址,分别是stack,heap,static object,stack地址往下增长,heap地址往上增长。只要记住:stack栈顶地址反而小,就知道往下增长了。禁止产生堆对象1、产生堆对象使用new operator,可认为new operator有三个过程: a、使用operator new操作符搜索可用的内存,分配一块内存; b、在这块内存上,调用构造方法构造一个对象; c、返回地址。2、要禁止产生堆对象,可以声明类的operator new为private,禁止分配内存就好了。为了保持一致性,将operator delete也重载为private。3、注意:new o... 阅读全文
posted @ 2014-02-13 20:01 Andy Niu 阅读(940) 评论(0) 推荐(1) 编辑
  2014年2月12日
摘要: 1、为了在运行期处理异常,程序必须做大量额外的工作。比如,即使抛出异常,也必须保证离开作用域的栈上对象执行析构方法。因此,必须记录try语句的进入点和离开点,记录catch语句能够处理的异常等。这就意味着,程序目标码变大,执行速度慢。2、即使从未使用任何异常处理,还是必须要付出最低代价,付出一些空间,放置某些数据结构,付出一些时间,保持数据结构的正确性。3、即使自己的程序没有使用throw,try,catch语句,使用的其他程序库可能有异常处理,因此也要付出代价。4、对于try语句,没有异常抛出的情况下,代码膨胀5%-10%,速度也下降这个数。5、如果抛出异常,影响很大,速度可能会比正常情况下 阅读全文
posted @ 2014-02-12 19:21 Andy Niu 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 1、方法返回对象,会导致临时对象的产生,这降低了效率,const Rational operator* (const Rational& lhs,Rational& rhs)。有没有什么解决办法呢?2、试图返回引用,方法内的局部对象,在方法执行完后销毁,这个引用指向垃圾。不可行。3、试图返回指针,这导致奇怪的语法Rational c = *(a*b); 并且要求客户执行delete,这不合理。就算客户正确执行delete,有些情况,方法返回值没有暴露指针,客户无法执行delete,比如:Rationald = *(a*b*c); 不可行。4、因此,必须返回对象。那该怎么办呢? 阅读全文
posted @ 2014-02-12 18:59 Andy Niu 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 1、判断是copy构造还是copy赋值,不是看是否有赋值操作符=,而是看对象当前是否已经有值了。如果没有值,就是copy构造。如果已经有值了,就是copy赋值。2、对象赋值的时候,源端与目标端类型不吻合,肯定要进行一次适配(而且只能是一次),中间产生一个临时对象。3、比如:Person p; p = 6; copy赋值的时候,要求rhs是个const Person&,显然6不是。因此,这里适配一下,用6构造一个临时对象,然后rhs指向这个临时对象。 那么接着思考,子类对象赋值给父类对象,会造成对象切割。那么这个过程是否产生临时对象呢?Person p; Student s; p=s; 阅读全文
posted @ 2014-02-12 18:34 Andy Niu 阅读(728) 评论(0) 推荐(0) 编辑
上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 58 下一页