上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 58 下一页
  2014年3月6日
摘要: 1、在C++中,明确指出,不要在父类构造方法调用虚方法,为啥? 因为,构造子类对象,首先调用父类构造方法(初始化列表,然后构造方法内代码),然后子类构造方法(初始化列表,然后构造方法内代码),在父类构造方法中,还没有子类的成分,也就是说,当前本质上还是父类对象。因此,调用的方法还是父类方法,不会产生预期的多态行为。2、但是,最近在C#当中发现一个很奇怪的现象:父类构造方法调用虚方法,也会产生多态的行为。确实让人奇怪,只能说编程语言细节太多。C#是如何做到的呢? 自己猜测,可能是在父类构造方法之前,完成了对虚方法表的整体拷贝,并且置换为重写后的方法。 阅读全文
posted @ 2014-03-06 20:45 Andy Niu 阅读(1259) 评论(0) 推荐(0) 编辑
摘要: 1、异常规范的使用场景是,承诺方法只抛出什么样的异常,或者不抛出异常。如果运行的时候,不满足承诺,C++自动调用unexpected方法,unexpected调用terminate方法,terminate调用abort方法结束程序。2、有三点需要注意:a、表面上不抛出任何异常,仔细分析还是可能会抛出异常;b、调用其他的方法,而其他的方法可能抛出异常;c、调用系统的方法,系统方法可能抛出异常。因此,承诺只抛出某些异常,或者不抛出异常(异常规范),基本上不太靠谱。3、如果抛出了,非预期的异常。默认情况下,调用unexpected-->terminate-->abort,导致程序结束。因 阅读全文
posted @ 2014-03-06 20:35 Andy Niu 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 1、在两种情况下,调用析构方法:a、在正常状态下被销毁,栈上的对象离开作用域或者堆上的对象执行delete;b、抛出异常,堆栈回滚,栈上已经构造好的对象,也就是抛出异常之前的代码,自动调用析构方法。注意:只会对已经构造好的栈上对象调用析构方法,而不会对已经初始化好的指针执行delete,因此,使用智能指针可以避免这种情况的资源泄漏。2、考虑下面的情况,析构方法中抛出异常,在外部捕获异常。如果是正常情况下调用析构方法,没有问题。如果由于异常,堆栈回滚对栈上已经构造好的的对象调用析构方法,这个时候析构方法又抛出一个异常,导致C++调用terminate方法,结束程序。3、析构方法抛出异常,还有另外 阅读全文
posted @ 2014-03-06 20:05 Andy Niu 阅读(367) 评论(0) 推荐(0) 编辑
  2014年3月5日
摘要: 1、回调方法是什么? 回调方法是把方法作为实参传递给另一个方法,比如传给Fun,Fun的形参是方法指针,回调方法与方法指针类型要匹配,在Fun中完成对方法的调用。2、回调方法解决什么问题?也就是说,它的使用场景是什么? a、事件驱动程序,点击按钮,我们期望做某件事,把自定义的方法传递过去。 b、在STL中,特别常用。STL中的算法,形参往往是个方法指针,允许用户自定义查询条件(也就是一个方法),传递给算法,算法负责调用这个方法。 c、异步回调方法,典型的情况如:socket编程中,acceptor.async_accept(client, callback)。可认为在异步方法async... 阅读全文
posted @ 2014-03-05 19:43 Andy Niu 阅读(772) 评论(0) 推荐(0) 编辑
  2014年3月4日
摘要: 1、sizeof返回的是字节个数,内存编址的最小单元是字节。因此,空对象,bool值占用的内存也是一个字节。2、可以对哪些东西求sizeof ? a、对象和类型。如int a; sizeof(a), sizeof(int),二者是等价的。同一类型的对象,大小是一致的,并且在内存中的布局也是一样的,这样编译器才能够按照统一的方式去解释。可以认为sizeof(a),转化为sizeof(int)进行求值。 b、不能对方法名和void,计算sizeof。 c、可以对指针计算sizeof,所有指针的大小都是4个字节。包括:指向数据的指针,指向方法的指针,指向void的指针。3、对于数组名,非常特殊... 阅读全文
posted @ 2014-03-04 20:23 Andy Niu 阅读(584) 评论(0) 推荐(0) 编辑
摘要: string-->int1、10进制string转化为int int('12')2、16进制string转化为int int('12', 16)int-->string1、int转化为10进制string str(18)2、int转化为16进制string hex(18)考虑,为什么没有16进制int转化为string,可以这么认为不管什么进制,python在内部表示都是10进制,先转化为10进制在进行。如16进制int转化为string,str(0x12),首先变为str(18),再到'18'。那么我想结果为'12' 阅读全文
posted @ 2014-03-04 20:10 Andy Niu 阅读(369117) 评论(0) 推荐(2) 编辑
摘要: 1、在C++中,可认为只有传值和传引用。传指针本质上就是传值。将a指针传给b指针,两个指针是两个对象(而引用是别名),它们的值相等,即a、b指向同一块内存。这个时候,要千万注意:修改指针使它指向另一块内存与修改指针指向的内容之间的区别。以b为例说明,修改b使它指向另一块内存,a不变,还是指向原来的内存,内容也不变。修改b指向的内容,由于a,b指向同一块内存,也就是修改a指向的内容,a内容发生变化。2、复制指针是浅拷贝,两个指针地址相同,共享同一块内存。如何进行深拷贝? 把原指针指向的内容做一个整体拷贝,新指针指向拷贝的内容,这就是深拷贝。注意:深拷贝后,每个指针指向不同的内存,内容相等,但是. 阅读全文
posted @ 2014-03-04 19:59 Andy Niu 阅读(1776) 评论(0) 推荐(0) 编辑
  2014年3月3日
摘要: 1、类中没有指针,如果对象构造过程中出现异常,C++保证已经构造好的那一部分自动销毁。注意:这里不是调用析构方法,而是编译器在你的构造方法中插入了一些代码,保证对已经构造好的对象析构。2、类中有指针,比如有a, b两个指针。对象构造时,a初始化完成,b抛出异常,C++只会对已经构造好的对象析构,而不会对已经初始化好的指针执行delete。因此资源泄漏。3、注意,这种情况下,绝不会调用析构方法,因为C++只会析构已经构造完成的对象。接着思考,在堆上分配对象,把指针传出来,对指针delete,可行吗? 不可行,因为构造过程出现异常,指针是传递不出来的。外部的指针还是null。4、思考:为什么C+. 阅读全文
posted @ 2014-03-03 20:32 Andy Niu 阅读(417) 评论(0) 推荐(0) 编辑
摘要: 1、在堆上获取的动态资源,用户忘记delete,或者由于异常导致没有没执行到delete,都会造成资源泄漏。2、我们知道,栈上的对象,离开作用域,必定要执行析构方法。即使抛出异常,会堆栈回滚,保证已经构造的对象进行析构。3、因此,可以使用栈上的对象,管理资源,在析构方法中释放资源,保证不会资源泄漏。4、考虑更一般化的资源,对于互斥体的加锁,解锁,也是同样的情况,需要保证互斥体一定会解锁。5、对资源管理的类,就是智能指针。因此,需要对不同类型的对象进行管理,智能指针是模板类,在栈上分配,行为像指针。常用的智能指针有auto_ptr,shared_ptr。注意,智能指针默认的删除动作是delete 阅读全文
posted @ 2014-03-03 19:49 Andy Niu 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 相对于C语言,C++增加了异常机制。考虑,异常解决了什么问题,又带来了什么问题。异常解决了什么问题:1、问题检测与问题处理相分离。2、C语言只是返回一个整数,而异常带有上下文信息,方便找出问题。3、C语言返回的整数,可能忘记检查,而异常不可忽略,必须处理。4、异常可以跳级,发生异常后,堆栈回滚,保证栈上的对象析构。异常带来了什么问题:1、代码膨胀。抛出异常,保证栈上的对象析构,编译器必须插入一些代码。2、效率低,抛出异常,必然有临时对象的产生。 阅读全文
posted @ 2014-03-03 19:24 Andy Niu 阅读(256) 评论(0) 推荐(0) 编辑
上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 58 下一页