C++中 "=default" 及 "=delete" 的使用
在 C++11 中,我们可以使用 "=default" 和 "=delete" 来精确地控制类的默认函数成员的生成情况,从而提高代码性能和可读性。下面将对 "=default" 和 "=delete" 的使用进行详细讲解。
"=default"
在 C++11 中,对于类的默认函数成员,可以使用 "=default" 来告知编译器生成标准的函数定义,这样做有助于提高编译器优化代码的能力。下面是使用 "=default" 关键字声明默认函数的方式:
class A {
public:
A() = default; // 默认构造函数
A(const A&) = default; // 拷贝构造函数
A(A&&) = default; // 移动构造函数
A& operator=(const A&) = default; // 赋值操作符
A& operator=(A&&) = default; // 移动操作符
~A() = default; // 析构函数
};
如上代码所示,通过在函数定义后添加 "=default" 关键字,表示该函数的默认实现与编译器生成的标准实现相同。如果 "=default" 声明放在函数声明的后面,则该函数应被视为声明,而不是定义。
"=delete"
相反,C++11 也提供了 "=delete" 关键字,它允许我们显式地告知编译器不生成指定函数的默认实现。下面是 "=delete" 的使用示例:
class B {
public:
B() = delete; // 防止调用默认构造函数
B(const B&) = delete; // 防止调用拷贝构造函数
B(B&&) = delete; // 防止调用移动构造函数
B& operator=(const B&) = delete; // 防止调用赋值操作符
B& operator=(B&&) = delete; // 防止调用移动操作符
~B() = default; // 默认析构函数
};
如上代码所示,通过在函数声明后添加 "=delete" 关键字,表示该函数应被视为被删除的函数。对于 "=delete" 声明适用的函数类型,编译器将不再为其生成默认实现。而且,如果尝试使用 "=delete" 函数,则编译器将会报错。
用法实例
- "=default" 的使用示例
class C {
public:
C() = default; // 生成标准默认构造函数
C(int x) : val(x) {} // 用户定义构造函数
private:
int val;
};
int main()
{
C a; // 调用默认构造函数,编译器将生成该函数
C b = a; // 调用拷贝构造函数,编译器将生成该函数
C c = std::move(a); // 调用移动构造函数,编译器将生成该函数
C d(10); // 调用用户定义的构造函数
return 0;
}
如上代码所示, "=default" 很容易地生成了默认函数成员。
- "=delete" 的使用示例
class D {
public:
D() = default; // 生成标准默认构造函数
D(int x) : val(x) {} // 用户定义构造函数
D(const D&) = delete; // 删除拷贝构造函数
D& operator=(const D&) = delete; // 删除赋值操作符
private:
int val;
};
int main()
{
// D a = b; // 无法调用被删除的拷贝构造函数,编译器将报错
// D c; c = b; // 无法调用被删除的赋值操作符,编译器将报错
return 0;
}
如上代码所示, "=delete" 能够有效地防止函数成员的误用和不必要的函数调用。
以上就是使用 "=default" 和 "=delete" 精细控制类默认函数成员的方法总结。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中 ‘=default ’及‘ =delete ’的使用 - Python技术站