C++四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast?
1)const_cast用于将const变量转为非const。
2)static_cast用的最多,对于各种隐式转换,非const转const,void*转指针等, static_cast能用于多态想上转化,如果向下转能成功但是不安全,结果未知。
3)dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。
4)reinterpret_cast几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用。
追问:为什么不使用C的强制转换?
为什么要使用智能指针?智能指针的类型?简单实现?什么时候改变引用计数?
1)能处理资源泄露问题;(忘记释放不再使用的内存)
2)能处理空悬指针的问题;(delete之后的野指针)
3)能处理比较隐晦的由异常造成的资源泄露。(程序抛出异常时,导致终止,而已申请的内存并没有释放掉)
C++标准提供的两种类型的智能指针:
1)shared_ptr(共享式拥有):多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。为了在结构复杂的情境中执行上述工作,标准库提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。
2)unique_ptr(独占式拥有):保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露——例如“以new创建对象后因为发生异常而忘记调用delete”——特别有用。
简单实现(改变引用计数):
1)构造函数中计数初始化为1;
2)拷贝构造函数中计数值加1;
3)赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;
4)析构函数中引用计数减一;
5)在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。
追问:share_prt与weak_ptr的区别:share_ptr可能出现循环引用,从而导致内存泄露,而weak_ptr是一种弱引用指针,其存在不会影响引用计数,从而解决循环引用的问题。
还可以内部维护一个链表实现,更容易定位哪里没释放,分配一次内存就将头节点放入链表
交换2个数据a b 不用第三个数
3) 位运算
通过异或运算也能实现变量的交换,请看以下代码:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
讲一讲GRE的实现,BFD的实现
模板类的实现
全部评论
(3) 回帖