本帖最后由 dong_abc 于 2013-8-31 12:23 编辑
第五章 提高类型安全
一、强类型枚举。
由于枚举的全局特性,显得与名字空间、类必须通过“名字::成员名”的方式来访问有些格格不入,而且还破坏了名字空间、类的封装特性。
所以C++11提出了“强类型枚举”。声明强类型枚举非常简单,只需要在enum后面加上class即可。- enum class color {whilte,black,red,yellow};
此时访问强类型枚举就需要“名字::成员名”的方式来访问了。
强类型枚举还可以显式的指定底层类型,
- enum class color:unsigned char {whilte,black,red,yellow};
二、智能指针 与 垃圾回收。
C++11增加了三个智能指针模板。unique_ptr , shared_ptr , weak_ptr .
unique_ptr留在后面再说。 shared_ptr 通过引用计数的方式来释放堆内存空间,而且允许多个该智能指针共享同一内存空间。
weak_ptr 可以指向shared_ptr 的内存空间,却并不拥有其内存空间, weak_ptr的成员lock可以返回其指向内存的一个shared_ptr对象,
且所指对象无效时返回空指针nullptr. 这在验证shared_ptr智能指针的有效性上很有用
看下面例程如何应用shared_ptr 的引用计数方式回收堆内存。
- #include<memory>
- #include<iostream>
- using namespace std;
- void check(weak_ptr<int> & wp)
- {
- shared_ptr<int> sp = wp.lock();
- if(sp != nullptr)
- cout<<"still "<< *sp<<endl;
- else
- cout<<"pointer is invalid"<<endl;
- }
- int main()
- {
- shared_ptr<int> sp1(new int(22));
- shared_ptr<int> sp2 = sp1;
- weak_ptr<int> wp = sp1;
- cout<<*sp1<<endl; //22
- cout<<*sp2<<endl; //22
- check(wp);
- sp1.reset();
- cout<<*sp2<<endl; //22
- check(wp);
- sp2.reset();
- check(wp); //pointer is invalid
- }
sp1.reset()并不能清除sp2的引用计数,sp2.reset()后sp2引用计数清零,检测wp得到pointer is invalid.
|