内容目录
假设现在在开发一个 Array
容器,而没有完全开发完,想暂时用一用。
然后把 Array
容器在某个类中定义为了成员变量。此时对这个类进行实例化 A
与 B
。
当使用 A = B
的时候,会调用此类的复制赋值运算符,而如果没有重写任何一个管理生命周期的函数的时候,此复制赋值运算符是默认行为。
也就是对每个成员变量调用复制赋值运算符,而 Array
的实例化在此类中,所以 Array
会被调用默认复制赋值运算符。
而众所周知,Array
需要额外的空间托管内存,所以复制赋值运算符只能复制成员变量或者指针等需要浅拷贝的东西。
如果这时候没有实现 复制赋值运算符 的话,会导致 Array
仅对成员变量进行拷贝,此时两个 Array
同时托管了同一个内存区域。
这时候就容易发生报错,并且逻辑是通畅的有时候很难追根溯源。
那么在没有完全开发完的时候,则需要对没有提供具体实现的函数显式的 = delete。
这时没有实现的函数会在编译期报错,就可以很方便的找到哪里的函数没有被实现,从而避免一些比较难找到的问题。
Array(const Array& NewArray) = delete; // 复制构造函数
Array(Array&& NewArray) = delete; // 移动构造函数
Array& operator= (const Array& NewArray) = delete; // 复制赋值运算符
Array& operator= (Array&& NewArray) = delete; // 移动赋值运算符
此时,没有被实现的生命周期函数会因为找不到实现而在编译时报错,这样有助于更好的找到问题所在。