摘要:
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)
浙公网安备 33010602011771号