18 |使用std::unique_ptr管理具备专属所有权的资源
当需要使用智能指针时,std::unique_ptr基本上应当是首选,因为默认情况下std::unique_ptr和裸指针有着相同的尺寸,且对于大多数的操作(包括提领),他们都是精确的执行了相同的指令。std::unique_ptr实现的是专属所有权语义,其只支持移动,不支持复制,也不能将一个裸指针直接赋值给std::unique_ptr
2,3,4,5,6,7,8,9,10,11,12,13,14
当需要使用智能指针时,std::unique_ptr基本上应当是首选,因为默认情况下std::unique_ptr和裸指针有着相同的尺寸,且对于大多数的操作(包括提领),他们都是精确的执行了相同的指令。std::unique_ptr实现的是专属所有权语义,其只支持移动,不支持复制,也不能将一个裸指针直接赋值给std::unique_ptr
这里所说的特种成员函数包括C++98已有的默认拷贝函数、析构函数、复制构造函数、复制赋值运算符以及C++11新增的移动构造函数以及移动赋值运算符。这些特种成员函数在特定场合,编译器都可以自动为其生成,且访问权限都是public的,inline类型的。以下几点是特种成员函数生成的特点:仅当一个类没有声明任何构造函数时,编译器才会自动生成默
我们知道const成员函数不会修改成员变量,即对变量进行只读操作,但是即使是只读,其函数真的是安全的吗?例如,我们在一个成员函数内获取某个对象的一个变量的值,其值在第一次和第二次读取有差异,代码如下:class MyClass{public:void Init() const {if (!Init
constexpr变量必须使用一个具有const属性,且在编译阶段就已知的值对其初始化。例如:int x = 0;const int y = x; //可以使用x对cosnt变量初始化const int z =&n
首先,如果知道一个函数不可能抛出异常,则应该将其声明为noexcept,以提高代码的运行效率,但是如果函数违反声明而抛出了异常,将导致程序直接中止。在C++98和C++11中都可以声明一个函数不会抛出异常,代码如下:int f(int x) throw(); //f不会抛出异常,C++98风格int f(int x) noexcept;
在C++98中 const_iterator得到的支持不够全面,使用起来相当费力,C++11对其做了一个很大的优化,但是仍然有死角,但是C++14将这些死角清除干净了,所以现在我们可以很好的使用它。首先我们要记住的是在C++11中无法将iterator强制转换为const_iterator,即使是static_cast或者reinterp
override声明的作用很简单,就是当你为子类改写从父类那里继承下来的成员函数时,如果因为各种原因,导致改写失败(失败原因有很多,例如形参类型错误、函数修饰词遗漏等等),将在编译时给你明确提示。除了这个知识点,这里另外再介绍一个知识点,就是引用修饰词:
如果你实现了某个类给其他程序猿使用,但是不想让他使用某个特定函数,那我们可以直接不声明该函数即可。但是如果这个函数是编译器自动生成的,例如默认赋值函数,那我们又应该怎么做呢?C++98中的做法是将该函数声明为private权限,这样就阻止了外部直接调用它,然后我们也不去定义它,这样当该类的成员函数误调用该函数时,会提示链接错误。例如:cl
首先通过两行代码了解,什么是限定作用域的枚举类型,什么是不限作用域的枚举类型。enum Color{black,white,red}; //不限作用域的枚举类型 enum class Color{black,white,red}; //限定作用域的枚举类型,多了一个class关键字优先使用限定作用域的枚举类型的原因有三个:1、降低名字空
using别名声明和typedef声明都可以完成一个类型的声明,但使用using可以很简单且直接的完成这个操作,下面将通过代码分别声明相同的类型,就可以看出using的好处了。