c++新特性:=delete

简介: c++新特性:=delete

C++11引入的=delete是一种特性,它用于明确禁用或删除类的成员函数、特殊成员函数、或者其他成员函数。=delete的主要目的是在编译时捕获潜在的错误,并提供更精确的控制,以确保类的行为符合设计要求

禁用默认函数:

使用=delete可以禁用类的默认构造函数、复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符或析构函数。这对于防止特定的操作非常有用,例如禁止对象的复制或禁止析构函数的调用。

class NonCopyable {
public:
    NonCopyable() = default;
    // 使用=delete禁止复制构造函数和复制赋值运算符
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;
};

防止意外重载:

使用=delete还可以防止意外的函数重载。当有多个重载版本的函数时,有时会出现参数类型非常相似的情况,可能会导致调用时的二义性。通过使用=delete可以明确禁用某些重载,以避免二义性错误。

#include <iostream>
void myFunction(int a) {
    std::cout<<a<<std::endl;
}
void myFunction(double) = delete; // 使用=delete禁止double类型的重载
int main() {
    myFunction(42);      // 调用int版本
    // myFunction(3.14); // 无法编译,double版本已被删除
    return 0;
}

更好的错误提示:

当使用=delete时,编译器会在出现违反删除约束的情况下生成更明确的错误消息,这有助于更快地识别和修复问题。

提高代码清晰性:

使用=delete可以使代码更加清晰,因为它明确表达了某些操作是被禁用的,而不是由于编译器的默认行为

=delete使用范围:

  1. 只能用于成员函数或全局函数:=delete 只能用于类的成员函数、全局函数或者重载操作符,不能用于局部变量、局部函数或类的数据成员。
  2. 不能用于默认函数参数: 不能在函数的默认参数上使用 =delete
  3. 不能用于虚函数: 不能使用 =delete 来删除虚函数,虚函数应该使用纯虚函数(virtual void func() = 0;)来声明。
  4. 不能用于非特殊成员函数的重载:=delete 不能用于非特殊成员函数的重载,例如,你不能使用 =delete 来删除一个普通成员函数,只能用于特殊成员函数,如构造函数、复制构造函数等。
  5. 类型相关性: 删除的函数必须与实际调用匹配,否则编译器可能会产生不一致的行为。
  6. 友元函数: 友元函数通常不受 =delete 影响,因为它们不属于类的成员函数。


相关文章
|
2月前
|
编译器 C++ 开发者
C++一分钟之-C++20新特性:模块化编程
【6月更文挑战第27天】C++20引入模块化编程,缓解`#include`带来的编译时间长和头文件管理难题。模块由接口(`.cppm`)和实现(`.cpp`)组成,使用`import`导入。常见问题包括兼容性、设计不当、暴露私有细节和编译器支持。避免这些问题需分阶段迁移、合理设计、明确接口和关注编译器更新。示例展示了模块定义和使用,提升代码组织和维护性。随着编译器支持加强,模块化将成为C++标准的关键特性。
103 3
|
2月前
|
编译器 C语言 C++
C++一分钟之-C++11新特性:初始化列表
【6月更文挑战第21天】C++11的初始化列表增强语言表现力,简化对象构造,特别是在处理容器和数组时。它允许直接初始化成员变量,提升代码清晰度和性能。使用时要注意无默认构造函数可能导致编译错误,成员初始化顺序应与声明顺序一致,且在重载构造函数时避免歧义。利用编译器警告能帮助避免陷阱。初始化列表是高效编程的关键,但需谨慎使用。
39 2
|
1月前
|
存储 C语言 C++
【C/C++】动态内存管理( C++:new,delete)
C++的`new`和`delete`用于动态内存管理,分配和释放内存。`new`分配内存并调用构造函数,`delete`释放内存并调用析构函数。`new[]`和`delete[]`分别用于数组分配和释放。不正确匹配可能导致内存泄漏。内置类型分配时不初始化,自定义类型则调用构造/析构。`operator new`和`operator delete`是系统底层的内存管理函数,封装了`malloc`和`free`。定位`new`允许在已分配内存上构造对象,常用于内存池。智能指针等现代C++特性能进一步帮助管理内存。
|
1月前
|
数据安全/隐私保护 C++
|
2月前
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
52 5
|
2月前
|
C++
C/C++内存管理(2):`new`和`delete`的实现原理
C/C++内存管理(2):`new`和`delete`的实现原理
|
2月前
|
安全 C++ 开发者
C++一分钟之-动态内存管理:new与delete
【6月更文挑战第19天】在C++中,`new`和`delete`用于动态内存管理,分配和释放堆内存。不正确使用可能导致内存泄漏和悬挂指针。要避免这些问题,确保每次`new`都有匹配的`delete`,释放内存后设指针为`nullptr`。使用`delete[]`释放数组,避免重复释放。智能指针如`std::unique_ptr`可自动管理内存,减少手动管理的风险。通过实例展示了如何使用智能指针进行安全的内存操作。
31 4
|
1月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。
|
1月前
|
存储 安全 编译器
|
3月前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
54 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性