现在位置: 首页 > C++11
五十一、通过定义类为final来阻止继承 有时我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类。为了实现这一目的,C++11新标准提供了一种防止继承的方法,即在类名后面跟一个关键字final: class NoDerived final {/**/}; //NoDerived不能作为基类 五十二、虚函数的override和final指示符 在c++11中我们可以使用override关键字来说明派生类中的虚函数。这么做的好处是在使得程序员的意图更加...
阅读全文
四十一、auto不能用于分配数组 虽然我们用空括号对数组中的元素进行值初始化,但不能在括号中给出初始化器,这意味着不能用auto分配数组。 四十二、动态分配数组的列表初始化 在新标准中,我们可以提供一个元素初始化器的花括号列表: //10个int分别用列表中对应的初始化器初始化 int *pia = new int[10]{0,1,2,3,4,5,6,7,8,9}; //10个string,前4个用给定的初始化器初始化,剩余的进行值初始化 string *pia3 = new string[10]{...
阅读全文
三十一、容器的非成员函数swap 在新标准库中,容器既提供成员函数版本的swap,也提供非成员版本的swap,而早期标准库版本只提供成员函数版本的swap。非成员版本的swap在泛形编程中是非常重要的,统一使用非成员版本的swap是一个好习惯。 三十二、容器insert成员的返回类型 在新标准下,接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器。(在旧版本中,这些操作返回void。)如果范围为空,不插入任何元素,insert...
阅读全文
二十一、使用decltype简化返回类型定义 如果我们知道函数返回的指针指向哪个数组,就可以使用decltype关键字声明返回类型。例如,下面的函数返回一个指针,该指针根据参数i的不同指向两个已知数组中的某一个 int odd[] = {1,3,5,7,9}; int even[] = {0,2,4,6,8}; //返回一个指针,该指针指向含有5个整数的数组 decltype(odd) *arrPtr(int i){ return (i % 2) ? &odd : &even; // 返回一个指向数组的指针 } arrPtr使用关...
阅读全文
十一、vector对象的列表初始化 c++11新标准提供了另外一种为vector对象的元素赋初值的方法,即列表初始化。此时,用花括号括起来的0个或多个元素值被赋给vector对象: vector<string> v1 = {"a", "an", "the"}; //列表初始化 vector<string> v2 = ("a", "an", "the"); //错误 十二、容器的cbegin和cend函数 begin和end返回的具体类型由对象是否是常...
阅读全文
C++Primer第五版对C++11的特性做了详细的介绍,现在对其做一个大致的归纳. 一、long long类型 在C++11中,标准要求long long整型可以在不同平台上有不同的长度,但至少有64位。我们在写常数字面量时,可以使用LL后缀(或是ll)标识一个long long类型的字面量,而ULL(或ull、Ull、uLL)表示一个unsigned long long类型的字面量。比如: long long int lli = -9000000000000000000LL; unsigned long long int ulli = -9000000000...
阅读全文
unique_ptr <>是c ++ 11提供的智能指针实现之一,用于防止内存泄漏。unique_ptr对象包含一个原始指针,并负责其生命周期。当这个对象被销毁的时候,它的析构函数会删除关联的原始指针。 unique_ptr有重载的- >和*运算符,所以它可以被用于类似于普通的指针。 示例: #include <iostream> #include <memory> struct Task {   int mId;   Task(int id) : mId(id) {     std::cout ...
阅读全文
shared_ptr的主要优点是当不再使用时会自动释放相关的内存。 但是如果我们不仔细使用shared_ptr,那么这个优势就会变成一个劣势。 我们来看看: 假设我设计一个二叉树,并在其中包含一个指向左右子节点的指针。 #include <iostream> #include <memory> class Node {   int value; public:   std::shared_ptr<Node> leftPtr;   std::shared_ptr<Node> rightPtr;   Node(int val) :...
阅读全文
1、尽量不要使用相同的原始指针来创建多个shared_ptr对象,因为在这种情况下,不同的shared_ptr对象不会知道它们与其他shared_ptr对象共享指针。 这样会造成什么样的问题? 设想两个shared指针由相同的原始指针创建: int *rawPtr = new int(); std::shared_ptr<int> ptr_1(rawPtr); std::shared_ptr<int> ptr_2(rawPtr); 假设ptr_2超出范围,那么它将删除关联的原始指针,这样ptr1就会指向一个悬挂指针。 所以,当...
阅读全文
++,--和[]操作符 相比于原始指针,shared_ptr只提供这些运算符: 1) ->, * 2) 比较运算符 但是,shared_ptr不提供 1) 指针运算比如+,-,++,-- 2) Operator [] 例子: #include <iostream> #include <memory> struct Sample {   void dummyFunction() {     std::cout << "dummyFunction" << std::endl;   } }; int main() {   std::shared_ptr<Sample>...
阅读全文