🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一.基本概念 1. **概念** 若用户未声明,则编译器可以自动声明的成员函数。 > 需要注意的是,有些情况下,用户未声明这些函数,编译器也不会自动声明这些成员函数。 2. 类型 + 构造函数 *constructor* + 析构函数 *destructor* + 拷贝构造函数 *copy constructor* + 拷贝赋值操作 *copy assignment operator* + \[11+\][$]移动构造函数 *move constructor* + \[11+\][$]移动赋值操作 *move assignment operator* 3. \[11+\][$]强行使用编译器的合成版本函数 + `函数()=default` + **类内使用 `=default` 声明时** 默认为内联函数 + **类外使用 `=default` 声明时** 默认为非内联函数 ```c++ class Complex{ public: /*使用默认的构造函数*/ Complex() = default; /*使用默认的拷贝构造函数*/ Complex(Complex&) = default; /*使用默认的拷贝赋值函数*/ Complex& operator=(Complex&) = default; /*使用默认的移动构造函数*/ Complex(Complex&&) = default; /*使用默认的移动赋值函数*/ Complex& operator=(Complex&&) = default; /*使用默认的析构函数*/ ~Complex() = default; } ``` ## \[11+\][$]二. delete 修饰符 1. 在参数列表后面加上 `=delete` 表示不允许以任何方式调用它们。 + 任何函数都可以加该修饰符。 + 该修饰符必须出现在函数第一次声明(或定义)的时候。 + 无法将删除的函数传递给函数指针。 + 这不代表删除该标识符,在名字查找时,该标识符仍是有效的。 2. **常见用途** 阻止对象的复制 >[warning] 请使用支持C++11标准的编译器运行此例 ```c++ #include <iostream> using namespace std; class Complex { public: /*使用默认的构造函数*/ Complex() = default; /*禁止使用拷贝构造函数*/ Complex(Complex &) = delete; /*禁止使用拷贝赋值函数*/ Complex &operator=(Complex &) = delete; /*使用默认的析构函数*/ ~Complex() = default; } int main() { Complex a,b; Complex c(a); //错误,不能使用删除的函数 b = a;//错误,不能使用删除的函数 return 0; } ``` > [success] 对于老版本的编译器,可以将相应函数声明为私有来实现禁用复制 3. 删除某些成员函数的后果 + 删除所有构造函数,对象将不能创建 + 删除析构函数,对象将不能删除 > 此时对象只能使用 `new` 来创建,且不能使用 `delete` 来删除。 + 删除复制函数,对象不能复制 > 同时无法用该对象作为函数的参数和返回值 + 删除移动函数,对象不能移动