4 提高类型安全
4.1 强类型枚举
C++ 98中的非强类型作用域,允许隐式转换为整型,占用存储空间及符号性不确定,都是枚举类的缺点。C++11引入枚举类,即强类型枚举。
强类型枚举优势:
- 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间
- 转换限制,强类型枚举成员的值不可以与整形隐式地相互转换
- 可以指定底层类型。强类型枚举默认的底层类型为int,但也可以显示地指定底层类型,具体方法在枚举名称后面加上":type",type是除了wchar_t以外的任何整型,如:
enum class Weight: char {General, Light, Medium, Heavy};
4.2 堆内存管理:只能指针与垃圾回收
4.2.1 C++ 11的智能指针
- unique_ptr
不能与其它unique_ptr类型的指针对象共享所指的内存。
unique_ptr<int> up1(new int(11));
unique_ptr<int> up2 = up1; //编译错误
unique_ptr<int> up3 = move(up1); //现在up3是数据唯一的upique_ptr智能指针。
- shared_ptr
实现上采用引用计数,其中一个shard_ptr指针放弃所有权(reset()),其它shared_ptr对对象的引用并不会受到影响。只有引用计数归0时,shared_ptr才会真正释放所占有的堆内存的空间。 - weak_ptr
可以指向shared_ptr指针指向的对象内存,却不拥有该内存(不会增加引用计数),使用weak_ptr成员的lock,返回其指向内存的一个shared_ptr对象,且在所指对象内存已经无效时,返回nullptr,这个能够验证share_ptr智能指针的有效性。
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;
}
}