上一页 1 ··· 29 30 31 32 33 34 35 36 37 ··· 58 下一页
  2014年1月10日
摘要: 1、为什么? 很简单,你指向箱子里面的一个物品,使用这个物品。但是箱子不受你控制,箱子销毁了,里面的物品也会随之销毁。那么这种情况下,你指向的就是一堆垃圾,你还在使用这个物品,导致未定义的行为。 阅读全文
posted @ 2014-01-10 19:19 Andy Niu 阅读(155) 评论(0) 推荐(0)
摘要: 1、C++是强类型语言,保证类型错误不会发生,转型会破坏类型系统。C语言提供了强制转型语法T(expn),或者T(expn),C++提供了新式转型。 const_cast(expn) static_cast(expn) dynamic_cast(expn) reinterpret_cast(expn) 强烈建议使用新式转型,因为:一是在代码中容易识别出来,二是各转型动作的目标窄化,编译器容易诊断出错误,可以简单认为,细化分工比原来的万能方式好。2、尽量避免转型,为什么?转型往往会影响效率,转型后出现临时对象,而应该使用无需转型的替代方法,比如virtual。 阅读全文
posted @ 2014-01-10 19:13 Andy Niu 阅读(232) 评论(0) 推荐(0)
摘要: 1、我们知道成员方法中,有个隐式的this常量指针。考虑,Derived继承的成员方法中this指针的表面类型是什么?子类重写的虚方法中this指针的表面类型是什么?2、Derived继承的方法,就是Base的那个方法,this指针的表面类型是Base*,也就是把this指针当成Base来解释。3、子类重写的方法中,this指针的表面类型是Derived*,也就是把this指针当成Derived来解释。注意:子类重写父类的方法,需要重新声明。 阅读全文
posted @ 2014-01-10 18:57 Andy Niu 阅读(352) 评论(0) 推荐(0)
摘要: 1、考虑下面的场景,有个类模版template Box{}; 内部有个方法XXX,现在子类template class BigBox:public Box{},BigBox内部使用方法XXX,考虑出现什么问题?2、首先一点,类模版产生出来的类之间,没有关系。也就是Box 与Box没有关系。通过指定模版实参,可以产生不同的模板类,也可以全特化一个类,如下: template class Box{...},这种情况下,就不再实例化模版类了,Box可以声明自己的接口,可能就没有了XXX。那么,问题出现了,BigBox继承Box,但是父类Box可能有接口XXX,也可能没有接口XXX,编译器傻眼了... 阅读全文
posted @ 2014-01-10 18:37 Andy Niu 阅读(345) 评论(0) 推荐(0)
摘要: 1、在template声明中,class与typename是等价的,但是使用typename更好。2、在template实现中,模版形参是从属名称,嵌套在模版形参中的类型是嵌套从属名称,不依赖任何template参数的名称,称为非从属名称。3、嵌套从属名称,可能会导致解析困难,出现二义性。比如:C::const_iterator* x; 有两种意思。一是:模版形参C中有个静态字段const_iterator,然后计算它与x的乘积;二是:模版形参C中有个嵌套类型const_iterator,定义指向它的指针。默认情况下,C++编译器按第一种意思解释,也就是说,把它当成静态字段,而不是类型。如果我 阅读全文
posted @ 2014-01-10 18:02 Andy Niu 阅读(556) 评论(0) 推荐(0)
摘要: 1、当初为什么设计C++ Template? C++ Template是为了建立类型安全的容器,如vector,可以建立包含Person的vector,也可以建立包含int的vector。后来发现,C++ Template具备更强大的威力,泛型编程,也就是写出的代码与所处理的对象类型彼此独立。2、面向对象总是显式接口和运行期多态,这个很好理解。显式接口就是类的头文件中暴露的方法和字段,运行时多态就是运行时根据对象的真实类型决定调用哪个方法。在泛型编程中,暴露的接口是隐式接口,也就是一组有效表达式,期望类的对象具有这些接口,如果没有代码编译通不过。编译时多态是指:在编译时根据模版实参实例化出一. 阅读全文
posted @ 2014-01-10 17:41 Andy Niu 阅读(308) 评论(0) 推荐(0)
  2014年1月9日
摘要: 1、为什么? 考虑下面的情况:方法声明为void processWidget(shared_ptr pw,int priority)。 调用方法 processWidget(shared_ptr (new Widget), getPriority()),在调用方法之前,要做三件事: a、执行new Widget b、调用shared_ptr的构造方法 c、调用方法getPriority() 可问题是:C++不保证上面的执行顺序(C#,Java保证)。那么问题就来了,如果是acb的执行顺序,并且c步骤异常,那么new出来的资源还没有放进资源管理类,导致内存泄漏。2、如何解决上面的问题... 阅读全文
posted @ 2014-01-09 20:44 Andy Niu 阅读(155) 评论(0) 推荐(0)
摘要: 简而言之,new时不带[],delete时也不带[];new时带[],delete时也要带[]。如果不匹配,要么造成多销毁对象,导致未定义行为;要么导致少销毁对象,导致内存泄漏。 阅读全文
posted @ 2014-01-09 20:03 Andy Niu 阅读(139) 评论(0) 推荐(0)
摘要: 1、为什么要这样做? 因为有的接口需要原始资源,比如方法void DoSth(const Person* p); 而现在我有一个shared_ptr person_ptr; 调用DoSth(person_ptr)编译失败,因为方法要一个Person指针,而person_ptr是一个对象。那怎么办?只能让资源管理类暴露资源。2、怎么暴露呢?两种办法:一种是提供显式方法,一种是隐式类型转换操作符:operator Person* () const ; 好像是一种特殊的方法:没有返回值,没有形参,重载了返回值的类型。根据准则:让接口容易被正确使用,不易被误用。应该使用显式方法,因为显式方法明确告诉. 阅读全文
posted @ 2014-01-09 19:56 Andy Niu 阅读(358) 评论(0) 推荐(0)
摘要: 1、为什么要使用资源管理类? 资源管理类的思路就是,栈上的对象,封装堆上分配的资源,确保一定会释放资源。auto_ptr和shared_ptr就是资源管理类,行为上像指针。2、auto_ptr和shared_ptr用来管理,堆上分配的内存,在auto_ptr和shared_ptr的析构方法中,执行delete。对于其他资源,auto_ptr和shared_ptr并不适合作为资源管理类。考虑互斥锁mutex,有普通方法lock和unlock,提供一个资源管理类Lock,管理mutex。资源管理类Lock被复制,将发生什么情况?该怎么办? a、禁止复制; b、采用引用计数法,也就是share... 阅读全文
posted @ 2014-01-09 19:33 Andy Niu 阅读(419) 评论(0) 推荐(0)
上一页 1 ··· 29 30 31 32 33 34 35 36 37 ··· 58 下一页